在JavaScript解析JSON吗?

Parse JSON in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

我想用JavaScript解析一个JSON字符串。反应是这样的

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

如何从中获取resultcount的值?


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

1
2
3
4
5
6
7
8
9
10
11
var json = '{"result":true,"count":1}',
    obj = JSON.parse(json);

alert(obj.count);

/* or ES6 */

const json = '{"result":true,"count":1}' || {};
const { result, count } = JSON.parse(json);
alert(result);
alert(count);

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

如注释所述,如果您已经在使用jquery,那么有一个$.parseJSON函数可以映射到JSON.parse(如果可用),或者在旧浏览器中有一个eval的形式。但是,这将执行额外的、不必要的检查,这些检查也是由JSON.parse执行的,因此为了获得最佳的全方位性能,我建议您这样使用它:

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

这将确保立即使用本机JSON.parse,而不是让jquery在将字符串传递给本机解析函数之前对其执行健全性检查。


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

之后,如果可以的话,我建议您使用一个JavaScript库(如jQuery或原型库),因为这些库处理得很好。

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

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

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

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

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

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


如果您是从外部站点获得的,那么使用jquery的getjson可能会有所帮助。如果它是一个列表,您可以用$迭代它。

1
2
3
4
5
6
$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});

如果要将JSON3用于较旧的浏览器,可以使用以下条件有条件地加载它:

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

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


下面的示例将清楚说明:

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

// Output: x, 11

您还可以使用eval功能。下面的示例使用eval函数:

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

// Output: x, 11

由于JSON.parse函数比eval函数更安全,执行速度更快,我建议您使用JSON.parse函数。


如果您将一个字符串变量(格式良好的JSON字符串)从mvc@viewbag传递给json.parse,该变量的双引号为"",则需要在json.parse(jsonstring之前对其进行处理。

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


您可以像在其他答案中那样使用eval函数。(别忘了加上大括号。)当你深入挖掘时,你就会知道为什么,或者简单地使用jquery函数parseJSON

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

您可以使用下面的代码。

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

您可以使用jsonObject.resultjsonObject.count访问这些字段。


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

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

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

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

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

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

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

现在运行命令:

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

您将得到输出作为对象结果:真,计数:1。

为了使用该对象,可以将它赋给变量,比如说obj

1
var obj = JSON.parse(response);

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

尝试运行命令

1
console.log(obj.result);

不使用库,您可以使用eval,这是您应该使用的唯一时间。不过,使用图书馆更安全。

如。。。

1
2
3
4
5
6
7
8
var response = '{"result":true ,"count":1}';

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

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

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


如果你喜欢

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

您可以通过带(.)点的jsonObject访问json元素:

1
2
JsonObject.result;
JsonObject.count;


我以为江户十一〔七〕行。但根据浏览器的不同,使用eval('('+myObject+')')可能是值得的。我唯一能推荐注意的问题是JSON中的多级列表。


一种简单的方法:

1
2
var data = '{"result":true,"count":1}';
var json = eval("[" +data+"]")[0]; // ;)

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

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

1
2
3
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并没有正式支持Internet Explorer 8(以及更旧的版本,就这点而言),尽管通过经验,大多数东西似乎都工作得很好。


如果使用Dojo工具包:

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


如果使用jquery,它很简单:

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