在 JavaScript 中解析 JSON?[复制]

Parse JSON in JavaScript? [duplicate]

提问人: 提问时间:2/9/2011 最后编辑:Taryn 更新时间:12/18/2020 访问量:2015689

问:

我想在 JavaScript 中解析 JSON 字符串。响应类似于

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

我怎样才能从中获取这些值?resultcount

JavaScript JSON 解析

评论

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

答:

2039赞 Andy E 2/9/2011 #1

在 JavaScript 中解析 JSON 的标准方法是 JSON.parse()

JSON API 是在 ES5(2011 年)中引入的,此后在市场份额和 Node.js 中实现了 >99% 的浏览器。它的用法很简单:

const json = '{ "fruit": "pineapple", "fingers": 10 }';
const obj = JSON.parse(json);
console.log(obj.fruit, obj.fingers);


唯一不能使用的情况是,如果你正在为一个古老的浏览器编程,如IE 7(2006),IE 6(2001),Firefox 3(2008),Safari 3.x(2009)等。或者,您可能处于不包含标准 API 的深奥 JavaScript 环境中。在这些情况下,请使用 json2.js,这是由 JSON 的发明者 Douglas Crockford 编写的 JSON 参考实现。该库将提供 的实现。JSON.parse()JSON.parse()

在处理非常大的 JSON 文件时,可能会因为其同步性质和设计而窒息。为了解决这个问题,JSON 网站建议使用第三方库,例如 Oboe.js单簧管,它们提供流式 JSON 解析。JSON.parse()

jQuery 曾经有一个 $.parseJSON() 函数,但在 jQuery 3.0 中被弃用了。无论如何,在很长一段时间里,它只不过是一个包装.JSON.parse()

评论

36赞 Andy E 11/16/2011
@Marwan: IE 8+支持。对于IE 6,7和其他较旧的浏览器,您可以使用我从帖子中链接到的json2.js。或者,但不太安全,您可以使用 .JSON.parse()eval
10赞 ThiefMaster 5/9/2012
除非他也需要JSON.stringify()
17赞 Andy E 4/2/2013
审阅者注意:在允许同行编辑之前,请彻底检查它们,因为您的操作可能会对用户从答案中复制和粘贴代码造成不必要的副作用。
12赞 Jasha 11/4/2013
没有必要先检查本机支持,然后回退到 jQuery。jQuery 1.10 首先尝试,然后尝试自己的实现。jQuery 2.x 直接调用,无需检查或回退。JSON.parseJSON.parse
4赞 Peter V. Mørch 1/7/2014
浏览器支持详细信息:是否可以使用 JSON 解析
22赞 El Ronnoco 2/9/2011 #2

如果不使用您可以使用的库 - 这是您应该使用的唯一时间。不过,使用库更安全。eval

例如...

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

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

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

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

评论

0赞 user192344 3/13/2012
eval 无法处理以 HTML 形式返回的 json 字符串
12赞 ThiefMaster 5/9/2012
如果它是 html 编码的,它就不再是 JSON。
2赞 Remember Monica 7/4/2013
eval 需要有效的 javascript,而 JSON 可能不是,因此 eval 无法解析某些有效的 JSON 文本(例如,U+2028 在 JSON 中有效,在 javascript 中无效)。
107赞 Clarence Fredericks 2/9/2011 #3

警告!

这个答案源于 JavaScript 编程的古老时代,当时没有内置的方法来解析 JSON。这里给出的建议不再适用,而且可能很危险。从现代的角度来看,通过涉及 jQuery 或调用 eval() 来解析 JSON 是无稽之谈。除非你需要支持 IE 7 或 Firefox 3.0,否则解析 JSON 的正确方法是 JSON.parse()。

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

之后,如果可以的话,我建议使用 JavaScript 库,例如 jQuery 或 Prototype,因为这些事情在这些库中处理得很好。

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

如果您从不绝对信任的其他源获取 JSON 对象,则不建议这样做,因为 eval 函数允许叛徒代码(如果您愿意的话)。

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

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

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

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

评论

0赞 Tahir Malik 10/2/2012
好人!我无法导入JSON库,因为它与其他库冲突
28赞 ray6080 9/10/2013
eval() 可以完成工作,但它可以编译和执行任何 Javascript 程序,因此可能存在安全问题。我认为JSON.parse()是更好的选择。
4赞 Amal Murali 7/30/2014
路人注意:这里有一个很好的在线工具,可以检查你的JSON字符串是否有效:jsonlint.com
17赞 Charles 7/22/2015
不 不 不!!!使用 eval 来评估 JSON 是一个非常危险的想法。您是否 100% 确定不可能有人将自己的代码注入您的字符串中?
4赞 Jezen Thomas 9/2/2016
值得一提的是,没有 JSON 对象这样的东西。
63赞 milestyle 7/19/2012 #4

如果你从外部站点得到这个,使用jQuery的getJSON可能会有所帮助。如果它是一个列表,你可以用 $.each 遍历它

$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});
13赞 ha9u63a7 4/4/2013 #5

我以为会起作用。但根据浏览器的不同,它可能值得使用 .我唯一可以建议注意的问题是 JSON 中的多级列表。JSON.parse(myObject)eval('('+myObject+')')

评论

3赞 Janaka R Rajapaksha 5/21/2014
eval() 也可以编译和执行任何 JavaScript。因此,如果使用 eval(),您将面临潜在的安全问题。但是 JSON 解析器只会识别 JSON 字符串并将它们编译成 JavaScript 对象。
41赞 huwiler 4/20/2013 #6

如果要将 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

评论

1赞 Peter V. Mørch 1/7/2014
json3.min.js 完成加载后即可使用它。当它可用时,这不会给你回调。因此,您的代码今天可能有效,但在周三 cdnjs.cloudflare.com 突然比平时慢或网络加载或 10000 个其他原因之一时无法工作。改为 RequireJS
6赞 huwiler 1/29/2014
彼得,这是不正确的。外部脚本的加载和 document.write 都是同步活动,因此放置在之后的所有脚本都将等到加载后再执行。对于仅加载 JSON3,这是一个很好的方法。如果您的项目越来越复杂并且必须加载具有复杂依赖关系的脚本,RequireJS 会派上用场。请记住,document.write 会阻止页面呈现,因此请将其放在标记的底部。
3赞 Peter V. Mørch 1/30/2014
不好意思;我认为你是对的。请忽略我的评论是假的。
0赞 tomByrer 3/10/2014
彼得,你的第一条评论是信息丰富且有用的(很高兴有这个警告),只是不适用于 100% 的情况。为了获得更稳定和更快的 CDN,您可以使用 jsDelivr//cdn.jsdelivr.net/json3/latest/json3.min.js
30赞 Teja 6/6/2013 #7

您可以像其他一些答案一样使用 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.resultjsonObject.count

更新:

如果你的输出是,那么你需要遵循这个答案。也许你的 json 字符串有数组格式。您需要像这样访问 json 对象属性undefined

var response = '[{"result":true , "count":1}]'; // <~ Array with [] tag
var jsonObject = JSON.parse(response);
console.log(jsonObject[0].result); //Output true
console.log(jsonObject[0].count); //Output 1

评论

0赞 Sahar Ch. 5/22/2014
控制台中的 jsonObject.count .log 返回 undefined。我应该怎么称呼它?
0赞 Ray Kim 11/5/2020
不要使用 eval 来解析 JSON,尤其是在未知方可以发送数据的情况下。函数可以包装在字符串中!
40赞 Joke_Sense10 10/1/2013 #8

以下示例将清楚地表明:

let contactJSON = '{"name":"John Doe","age":"11"}';
let contact = JSON.parse(contactJSON);
console.log(contact.name + ", " + contact.age);

// Output: John Doe, 11

评论

1赞 Simon B. 3/26/2019
使用是危险的eval()
0赞 M. Al Jumaily 8/9/2019
@SimonB。你能进一步详细说明一下吗?
0赞 Simon B. 8/9/2019
@M.AlJumaily,请参阅 softwareengineering.stackexchange.com/questions/311507/...,并将您的问题带到下一次极客聚会上,以获得免费的热门话题。自由的战斗语言是可以期待的。9-9
0赞 M. Al Jumaily 8/9/2019
@SimonB。谢谢,我会仔细阅读:)
6赞 legendJSLC 3/12/2014 #9

如果使用 jQuery,则很简单:

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

评论

2赞 Boris Parfenenkov 4/1/2014
关于这个问题已经给出了相同的答案。stackoverflow.com/a/16953423/2392330
0赞 legendJSLC 5/11/2015
对不起,我上面没有看到。
8赞 user2359695 7/2/2014 #10

正如许多其他人所提到的,大多数浏览器都支持 和 .JSON.parseJSON.stringify

现在,我还想补充一点,如果您使用的是 AngularJS(我强烈推荐),那么它还提供了您需要的功能:

var myJson = '{"result": true, "count": 1}';
var obj = angular.fromJson(myJson);//equivalent to JSON.parse(myJson)
var backToJson = angular.toJson(obj);//equivalent to JSON.stringify(obj)

我只是想添加有关 AngularJS 的内容以提供另一种选择。请注意,AngularJS 并不正式支持 Internet Explorer 8(以及旧版本),尽管根据经验,大多数东西似乎都运行良好。

8赞 Brendon-Van-Heyzen 7/18/2014 #11

如果您使用 Dojo Toolkit

require(["dojo/json"], function(JSON){
    JSON.parse('{"hello":"world"}', true);
});

评论

0赞 GGSoft 1/3/2018
var j='[{ “name”:“John”, “age”:30, “city”:“纽约”}, { “name”:“George”, “age”:48, “city”:“库塔伊西”}]';var obj = JSON.parse(j);警报(obj.length);for(var i=0; i<obj.length; i++){ alert(obj[i].city + ' ' + obj[i].age);
10赞 yassine 9/25/2014 #12

一个简单的方法:

var data = '{"result":true,"count":1}';
var json = eval("[" +data+ "]")[0]; // ;)
33赞 Jenna Leaf 10/22/2014 #13

如果将字符串变量(格式正确的 JSON 字符串)从 MVC @Viewbag传递到 JSON.parse,并且该变量将双引号 '“' 作为引号,则需要在 JSON.parse (jsonstring)

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

评论

0赞 Kijewski 10/23/2014
你这是什么意思?你为什么要发布一个古老问题的答案?
8赞 Jenna Leaf 10/23/2014
他们在前面的答案中所说的对参数值在字符串中包含双引号的情况没有帮助。它需要在全球范围内用真正的双引号替换!我很难发现,只是为了分享,以防有人遇到同样的问题
6赞 Jenna Leaf 10/23/2014
凯:我现在澄清了我的帖子,这是我第一次尝试提供帮助。请再看一遍帖子。您知道从服务器页面输出的引用事物对 JSON.parse() 来说是一个真正的问题。
24赞 Pushkar Kathuria 2/18/2015 #14

JSON.parse() 将传递到函数中的任何 JSON 字符串转换为 JSON 对象。

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

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);

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

尝试运行命令

console.log(obj.result);
21赞 user5676965418 5/15/2015 #15

如果你喜欢

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

您可以通过 JsonObject 使用 (.) dot 访问 JSON 元素:

JsonObject.result;
JsonObject.count;
26赞 Jorgesys 6/4/2015 #16

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

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

以下是如何获取值的示例:

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