安全地将JSON字符串转换为对象

Mat*_*ard 1298 javascript json

给定一串JSON数据,您如何安全地将该字符串转换为JavaScript对象?

很显然,你可以通过像......这样的东西不安全地做到这一点.

var obj = eval("(" + json + ')');
Run Code Online (Sandbox Code Playgroud)

...但是这使得我们容易受到包含其他代码的json字符串的影响,这对于简单的eval来说似乎非常危险.

Jon*_*an. 1911

JSON.parse(jsonString) 只要你能保证一个合理的现代浏览器,它就是一种纯粹的JavaScript方法.

  • 我很确定它对Node.js来说是安全的 (74认同)
  • @vsync你确实意识到这只是****纯Javascript答案...如果你读了javascript标签的描述你会看到这个......"*除非还包括框架/库的标签,一个纯粹的JavaScript答案是预期的.*"..我给这个**+ 1**作为唯一的javascript答案... (73认同)
  • 如果你正在做NodeJS,我无法加载jQuery只是为了将jsonString解析为JSON对象.所以提升乔纳森的答案 (12认同)
  • 根据[**this link**](http://caniuse.com/#search=JSON.parse),IE8 +支持它,虽然它说:`要求文件在IE8 +标准模式下工作在IE8中. ` (6认同)
  • [非常安全使用](http://stackoverflow.com/questions/891299/browser-native-json-support-window-json). (4认同)
  • 并非所有浏览器都支持它,但下面链接中的脚本将其添加到没有它的浏览器:https://github.com/douglascrockford/JSON-js/blob/master/json2.js (3认同)
  • 我认为这里值得一提的是,通过添加 `try{} catch(e){}` 来优雅地处理失败是一个好主意 (2认同)

Ale*_*x V 873

现在不推荐使用jQuery方法.请改用此方法:

let jsonObject = JSON.parse(jsonString);
Run Code Online (Sandbox Code Playgroud)

使用弃用的jQuery功能的原始答案:

如果您正在使用jQuery,请使用:

jQuery.parseJSON( jsonString );
Run Code Online (Sandbox Code Playgroud)

这正是您正在寻找的(请参阅jQuery 文档).

  • `jQuery.parseJSON`默认使用`JSON.parse`如果它存在,所以使用它的唯一原因是真实的,如果你需要回退<IE7.在jQuery 1.6中改变了它:http://james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON (8认同)
  • 2016更新:从jQuery 3.0开始,不推荐使用[$ .parseJSON](https://api.jquery.com/jQuery.parseJSON/),您应该使用原生JSON.parse方法. (7认同)
  • 是否有理由在JSON.parse()上使用它? (6认同)

Joh*_*ohn 154

编辑:这个答案适用于IE <7,现代浏览器检查Jonathan的答案.

编辑:这个答案已经过时,乔纳森上面的回答(JSON.parse(jsonString))现在是最好的答案.

JSON.org有许多语言的JSON解析器,包括4个不同的Javascript解析器.我相信大多数人会认为json2.js是他们的goto实现.

  • 我希望人们停止投票给这个答案.它在2008年发布时是准确的.只需投票给新的. (24认同)
  • 如果答案现已过时,请考虑更新答案. (20认同)
  • 对于IE <8,你需要使用它. (2认同)

Ron*_*ite 71

使用MSDN上以下链接中表示的简单代码.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
Run Code Online (Sandbox Code Playgroud)

并反转

var str = JSON.stringify(arr);
Run Code Online (Sandbox Code Playgroud)


Mar*_*iek 21

我不确定其他方法,但这是你在Prototype(JSON教程)中的表现.

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});
Run Code Online (Sandbox Code Playgroud)

使用true 调用evalJSON()作为参数清理传入的字符串.


Cod*_*ody 20

这似乎是个问题:

通过ajax websocket等接收输入,它总是以String格式 - 但你需要知道它是否是JSON.parsable.Touble是,如果你总是通过JSON.parse运行它,程序可以继续"成功"但你仍然会看到控制台中出现的错误,其中包含可怕的"错误:意外标记'x'".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});
Run Code Online (Sandbox Code Playgroud)


Lea*_*nan 15

如果你正在使用jQuery,你也可以这样做__CODE__

然后,你可以做这样的事情__CODE__,__CODE__等等.


Pra*_*lad 13

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
Run Code Online (Sandbox Code Playgroud)

回调传递返回的数据,该数据将是JSON结构定义的JavaScript对象或数组,并使用该$.parseJSON()方法进行解析.


les*_*ome 10

只是为了好玩,这是使用功能的方式:

 jsonObject = (new Function('return ' + jsonFormatData))()
Run Code Online (Sandbox Code Playgroud)

  • 这有使用`eval`的所有缺点,但更复杂,维护人员更难理解. (6认同)
  • 这非常类似于使用`eval`来做它并且不安全.:P (5认同)
  • 有趣的方法,我不确定我是否会在 JSON.Parse 可用的情况下使用它,但很高兴看到有人跳出框框思考。 (2认同)

GPr*_*hap 8

尝试将此方法与此Data对象一起使用.前:Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}
Run Code Online (Sandbox Code Playgroud)

当您使用串行端口编程时,此方法确实有助于Nodejs


小智 7

使用JSON.parse可能是最好的方法.这是一个现场演示示例

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);
Run Code Online (Sandbox Code Playgroud)


Jor*_*sys 7

使用parse()方法最简单的方法:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);
Run Code Online (Sandbox Code Playgroud)

那么你可以得到jQuery.parseJSON()元素的值,例如:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;
Run Code Online (Sandbox Code Playgroud)

使用文档中描述的jQuery:

JSON.parse(jsonString);
Run Code Online (Sandbox Code Playgroud)


Dor*_*ian 5

我找到了一个“更好”的方法:

在 CoffeeScript 中:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }
Run Code Online (Sandbox Code Playgroud)

在 JavaScript 中:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});
Run Code Online (Sandbox Code Playgroud)


Tah*_*koz 5

JSON 解析总是很痛苦。如果输入不符合预期,它会引发错误并导致您正在执行的操作崩溃。

您可以使用以下小函数来安全地解析您的输入。即使输入无效或已经是一个对象,它总是会转动一个对象,这在大多数情况下更好:

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};
Run Code Online (Sandbox Code Playgroud)


Ami*_*esh 5

用 解析 JSON 字符串JSON.parse(),数据就变成了 JavaScript 对象:

JSON.parse(jsonString)
Run Code Online (Sandbox Code Playgroud)

这里,JSON代表处理JSON数据集。

想象一下我们从网络服务器收到了这样的文本:

'{ "name":"John", "age":30, "city":"New York"}'
Run Code Online (Sandbox Code Playgroud)

解析为 JSON 对象:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 
Run Code Online (Sandbox Code Playgroud)

下面obj是相应的 JSON 对象,如下所示:

{ "name":"John", "age":30, "city":"New York"}
Run Code Online (Sandbox Code Playgroud)

要获取值,请使用.运算符:

obj.name // John
obj.age //30
Run Code Online (Sandbox Code Playgroud)

将 JavaScript 对象转换为字符串JSON.stringify()