题 在JavaScript中解析JSON? [重复]


这个问题在这里已有答案:

我想在JavaScript中解析JSON字符串。响应是这样的

var response = '{"result":true,"count":1}';

我怎样才能获得这些价值观 result 和 count 由此?


1515
2018-02-08 16:34


起源


var json ='{“result”:true,“count”:1}',obj = JSON.parse(json);的console.log(obj.count); //如果在nodejs中使用,则使用控制台 - Shekhar Tyagi


答案:


大多数浏览器支持 JSON.parse(),这是在ECMA-262第5版(JavaScript所基于的规范)中定义的。它的用法很简单:

var json = '{"result":true,"count":1}',
    obj = JSON.parse(json);

alert(obj.count);

对于没有的浏览器,您可以使用它来实现它 json2.js

正如评论中所指出的,如果你已经在使用jQuery,那就有一个 $.parseJSON 映射到的函数 JSON.parse 如果可用或形式 eval 在旧浏览器中。但是,这会执行额外的,不必要的检查,这些检查也会执行 JSON.parse,所以为了最好的全面性能,我建议使用它如下:

var json = '{"result":true,"count":1}',
    obj = JSON && JSON.parse(json) || $.parseJSON(json);

这将确保您使用原生 JSON.parse 立即,而不是让jQuery在将字符串传递给本机解析函数之前对字符串执行完整性检查。


1868
2018-02-08 16:38



@Marwan:IE 8+支持 JSON.parse()。对于IE 6,7和其他旧版浏览器,您可以使用我发布的链接到的json2.js。或者,但不太安全,您可以使用 eval。 - Andy E
除非他也需要 JSON.stringify() - ThiefMaster♦
审核人员请注意:在允许之前请彻底检查对等编辑,因为您的操作可能会导致用户从答案中复制和粘贴代码时产生不必要的副作用。 - Andy E
没有必要先检查本机支持然后再回到jQuery。 jQuery 1.10尝试 JSON.parse 首先,然后是自己的实现。 jQuery 2.x直接调用 JSON.parse 没有检查或后退。 - Jasha
浏览器支持细节: 我可以使用JSON解析吗? - Peter V. Mørch


首先,您必须确保JSON代码有效。

之后,如果可以的话,我建议使用jQuery或Prototype等JavaScript库,因为这些东西在这些库中得到了很好的处理。

另一方面,如果您不想使用库并且可以保证JSON对象的有效性,我只需将该字符串包装在匿名函数中并使用eval函数。

如果您从另一个不完全信任的源获取JSON对象,则不建议这样做,因为如果您愿意,eval函数允许使用renegade代码。

以下是使用eval函数的示例:

var strJSON = '{"result":true,"count":1}';
var objJSON = eval("(function(){return " + strJSON + ";})()");
alert(objJSON.result);
alert(objJSON.count);

如果您控制正在使用的浏览器,或者您不担心使用旧浏览器的人,则可以始终使用JSON.parse方法。

这确实是未来的理想解决方案。


91
2018-02-08 16:46



好人!我无法导入JSON库,因为它与其他库冲突 - Tahir Malik
eval()可以完成一项工作,虽然它可以编译和执行任何Javascript程序,所以可以 安全问题。我认为JSON.parse()是一个更好的选择。 - ray6080
路人须知: 这是一个很好的在线工具,用于检查您的JSON字符串是否有效: jsonlint.com - Amal Murali
不不不!!!使用eval来评估JSON是一个非常危险的想法。您是否100%确定有人可能会将自己的代码注入您的字符串? - Charles
值得一提的是,没有这样的东西 JSON对象。 - Jezen Thomas


如果从外部站点获取此信息,使用jQuery的getJSON可能会有所帮助。如果它是一个列表,您可以使用$ .each迭代它

$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});

49
2017-07-18 21:57





如果你想使用 JSON 3 对于旧版浏览器,您可以使用以下条件有条件地加载:

<script>
    window.JSON || 
    document.write('<script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.2.4/json3.min.js"><\/scr'+'ipt>');
</script>

现在的标准 window.JSON 无论客户端运行什么浏览器,都可以使用对象。


32
2018-04-19 18:52



它可供您使用 后 json3.min.js 已经完成加载。当它可用时,这不会给你回调。因此,您的代码今天可能有效,但是当cdnjs.cloudflare.com突然比平时慢或网络加载或其他10000个原因之一时,它将无法工作。 RequireJS 代替。 - Peter V. Mørch
彼得,这是不正确的。外部脚本和document.write的加载都是同步活动,因此之后放置的所有脚本都会等到它在执行之前加载。对于仅加载JSON3,这是一个很好的方法。如果您的项目变得复杂并且必须加载具有复杂依赖关系的脚本,RequireJS会派上用场。请记住,document.write将阻止页面呈现,因此将其放在标记的底部。 - huwiler
抱歉;我想你是正确的。请忽略我的评论作为虚假。 - Peter V. Mørch
彼得,你的第一条评论内容丰富且有用(很有警告),仅适用于100%的情况。对于更稳定和更快的CDN,您可以使用 jsDelivr: //cdn.jsdelivr.net/json3/latest/json3.min.js - tomByrer


以下示例将明确说明:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = JSON.parse(jsontext);
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

要么

你也可以使用 eval 功能。以下示例使用 eval 功能:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = eval('(' + jsontext + ')');
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

自从 JSON.parse 函数比eval函数更安全,执行速度更快,我建议你使用 JSON.parse 功能。


31
2017-10-01 07:42





如果你将一个字符串变量(一个结构良好的JSON字符串)传递给MVC @Viewbag的JSON.parse,它有双引号'''作为引号,你需要在JSON.parse之前处理它(jsonstring

    var jsonstring = '@ViewBag.jsonstring';
    jsonstring = jsonstring.replace(/&quot;/g, '"');  

25
2017-10-22 15:06



你那是什么意思?你为什么要发一个古老问题的答案? - kay
他们在之前的答案中所说的内容无助于如果参数值在字符串中有双引号的情况。它需要在全球范围内以真正的双引号取代!!我发现只是为了分享以防有人遇到同样的问题 - Jenna Leaf
凯:我现在澄清了我的帖子,这是我第一次尝试帮助。请再次查看帖子。您知道从服务器页面输出的引用事物是JSON.parse()的真正问题。 - Jenna Leaf


您可以像使用其他答案一样使用eval函数。 (不要忘记额外的大括号。)当你深入挖掘时,你会知道为什么,或者只是使用jQuery函数 parseJSON

var response = '{"result":true , "count":1}'; 
var parsedJSON = $.parseJSON(response);

要么

您可以使用以下代码。

var response = '{"result":true , "count":1}';
var jsonObject = JSON.parse(response);

您可以使用访问字段 jsonObject.result 和 jsonObject.count


24
2018-06-06 03:51



console.log中的jsonObject.count返回undefined。我怎么称呼它? - Sahar Ch.


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

var response = '{"a":true,"b":1}';
var JsonObject= JSON.parse(response);

这是如何获取值的示例:

var myResponseResult = JsonObject.a;
var myResponseCount = JsonObject.b;

23
2018-06-04 14:44





不使用库,您可以使用 eval  - 你唯一应该使用的时间。但是使用库更安全。

例如...

var response = '{"result":true , "count":1}';

var parsedJSON = eval('('+response+')');

var result=parsedJSON.result;
var count=parsedJSON.count;

alert('result:'+result+' count:'+count);

19
2018-02-08 16:45



eval不能处理以HTML格式返回的json字符串 - user192344
如果它是html编码的,它不再是JSON了。 - ThiefMaster♦
eval期望有效的javascript,JSON可能不是,因此eval无法解析一些有效的JSON文本(例如,U + 2028在JSON中有效,在javascript中无效)。 - Marc Lehmann


JSON.parse()将传递给函数的任何JSON String转换为JSON对象。

为了更好地理解,请按 F12 打开浏览器的Inspect Element,然后转到控制台以编写以下命令:

var response = '{"result":true,"count":1}'; // Sample JSON object (string form)
JSON.parse(response); // Converts passed string to a JSON object.

现在运行命令:

console.log(JSON.parse(response));

您将获得输出为Object {result:true,count:1}。

为了使用该对象,您可以将其分配给变量 obj

var obj = JSON.parse(response);

现在通过使用 obj 和点(。)运算符,您可以访问JSON对象的属性。

尝试运行该命令

console.log(obj.result);

19
2018-02-18 10:08