在JavaScript中解析JSON?

1642 javascript parsing json

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

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

我怎样才能获得的值result,并count从这个?

And*_*y E 1946

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

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

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

如评论中所述,如果您已经在使用jQuery,那么有一个JSON函数可以映射到JSON.parse()可用的或JSON.parse()旧版浏览器中的一种形式.但是,这会执行额外的,不必要的检查也会执行JSON.parse(),因此为了获得最好的全面性能,我建议使用它,如下所示:

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

这将确保您$.parseJSON()立即使用native ,而不是让jQuery在将字符串传递给本机解析函数之前对字符串执行完整性检查.

  • @Marwan:IE 8+支持`JSON.parse()`.对于IE 6,7和其他旧版浏览器,您可以使用我发布的链接到的json2.js.或者,但不太安全,你可以使用`eval`. (34认同)
  • 审核人员请注意:在允许之前请彻底检查对等编辑,因为您的操作可能会导致用户从答案中复制和粘贴代码时产生不必要的副作用. (17认同)
  • 没有必要先检查本机支持然后再回到jQuery.jQuery 1.10首先尝试`JSON.parse`,然后是自己的实现.jQuery 2.x直接调用`JSON.parse`而不检查或回退. (12认同)
  • 除非他还需要`JSON.stringify()` (10认同)
  • 浏览器支持详细信息:[我可以使用JSON解析](http://caniuse.com/json) (4认同)
  • @AndyE,如果JSON是"{"1":{"result":"true","count":"1"},"2":{"result":"false","count": "2"}}'`而不是?我们将在输出中有一个[Object object].在这种情况下如何做到这一点? (2认同)

小智 101

首先,您必须确保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);
Run Code Online (Sandbox Code Playgroud)

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

这真的是未来的理想解决方案.

  • eval()可以完成一项工作,而它可以编译和执行任何Javascript程序,因此可能存在[安全问题](http://www.json.org/js.html).我认为JSON.parse()是一个更好的选择. (24认同)
  • 不不不!!!使用eval来评估JSON是一个非常危险的想法.您是否100%确定有人可能会将自己的代码注入您的字符串? (16认同)
  • *路人的注意事项:*这是一个很好的在线工具,可以检查你的JSON字符串是否有效:http://jsonlint.com (4认同)
  • 值得一提的是,没有_JSON object_这样的东西. (3认同)

小智 59

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

$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});
Run Code Online (Sandbox Code Playgroud)


huw*_*ler 36

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

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

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

  • 彼得,这是不正确的.加载外部脚本和document.write都是同步活动,因此之后放置的所有脚本将等到它在执行之前加载.对于仅加载JSON3,这是一个很好的方法.如果您的项目变得复杂并且必须加载具有复杂依赖关系的脚本,RequireJS会派上用场.请记住,document.write将阻止页面呈现,因此将其放在标记的底部. (5认同)
  • 抱歉; 我觉得你是对的.请忽略我的评论作为虚假. (3认同)

Jok*_*e10 36

以下示例将明确说明:

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

// Output: John Doe, 11
Run Code Online (Sandbox Code Playgroud)

要么

您也可以使用该__CODE__功能.以下示例使用以下__CODE__函数:

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

// Output: John Doe, 11
Run Code Online (Sandbox Code Playgroud)

由于该__CODE__函数比eval函数更安全并且执行速度更快,我建议您使用__CODE__函数.


Jen*_*eaf 30

如果您通过从MVC @Viewbag一个字符串变量(一个结构良好的JSON字符串)JSON.parse有双引号,""",因为报价,你需要JSON.parse之前处理它(jsonstring)

    var jsonstring = '@ViewBag.jsonstring';
    jsonstring = jsonstring.replace(/&quot;/g, '"');  
Run Code Online (Sandbox Code Playgroud)

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

Tej*_*eja 28

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

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

要么

您可以使用以下代码.

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

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


Jor*_*sys 25

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

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

这是如何获取值的示例:

var myResponseResult = JsonObject.a;
var myResponseCount = JsonObject.b;
Run Code Online (Sandbox Code Playgroud)


小智 23

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.
Run Code Online (Sandbox Code Playgroud)

现在运行命令:

console.log(JSON.parse(response));
Run Code Online (Sandbox Code Playgroud)

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

为了使用该对象,您可以将其分配给变量,让我们说obj:

var obj = JSON.parse(response);
Run Code Online (Sandbox Code Playgroud)

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

尝试运行该命令

console.log(obj.result);
Run Code Online (Sandbox Code Playgroud)


El *_*oco 20

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

例如...

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

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

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

alert('result:'+result+' count:'+count);
Run Code Online (Sandbox Code Playgroud)

  • 如果它是html编码的,它不再是JSON了. (12认同)
  • eval期望有效的javascript,JSON可能不是,因此eval无法解析一些有效的JSON文本(例如,U + 2028在JSON中有效,在javascript中无效). (2认同)

小智 19

如果你喜欢

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

您可以通过带有(.)点的JsonObject访问JSON元素:

JsonObject.result;
JsonObject.count;
Run Code Online (Sandbox Code Playgroud)


ha9*_*3ar 12

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

  • eval()也可以编译和执行任何javascript.因此,如果使用eval(),则存在潜在的安全问题.但是json解析器只能识别json字符串并将它们编译成javascript对象. (3认同)

小智 11

一个简单的方法:

var data = '{"result":true,"count":1}';
var json = eval("[" +data+ "]")[0]; // ;)
Run Code Online (Sandbox Code Playgroud)


小智 8

正如许多其他人所提到的,大多数浏览器支持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)
Run Code Online (Sandbox Code Playgroud)

我只想添加有关AngularJS的内容以提供另一种选择.请注意,AngularJS并未正式支持Internet Explorer 8(以及旧版本),但通过经验,大多数内容似乎都运行良好.


Bre*_*zen 8

如果您使用Dojo Toolkit:

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


小智 6

如果你使用jQuery,它很简单:

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

  • 在这个问题上已经提出了相同的答案.http://stackoverflow.com/a/16953423/2392330 (2认同)