【问题标题】:Parse JSON in JavaScript? [duplicate]在 JavaScript 中解析 JSON? [复制]
【发布时间】:2017-12-04 15:21:27
【问题描述】:

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

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

如何从中获取值 resultcount

【问题讨论】:

  • var json = '{"result":true,"count":1}', obj = JSON.parse(json);控制台.log(obj.count); // 如果在 nodejs 中使用,则使用控制台

标签: javascript json parsing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • @Marwan:IE 8+ 支持JSON.parse()。对于 IE 6、7 和其他较旧的浏览器,您可以使用我在帖子中链接到的 json2.js。或者,但不太安全,您可以使用eval
  • 除非他也需要JSON.stringify()
  • 审阅者注意:在允许同行编辑之前,请彻底检查同行编辑,因为您的操作可能会导致用户从答案中复制和粘贴代码产生不必要的副作用。
  • 没有必要先检查原生支持然后回退到 jQuery。 jQuery 1.10 首先尝试JSON.parse,然后是自己的实现。 jQuery 2.x 直接调用JSON.parse 没有检查或回退。
  • 浏览器支持详情:Can I use JSON parsing
【解决方案2】:

警告!

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

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

之后,如果可以的话,我会推荐使用 jQuery 或 Prototype 等 JavaScript 库,因为这些库可以很好地处理这些事情。

另一方面,如果您不想使用库并且可以保证 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 方法。

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

【讨论】:

  • 好人!我无法导入 JSON 库,因为它与其他库冲突
  • eval() 可以完成一个工作,它可以编译和执行任何Javascript程序,所以可以有security issues。我认为 JSON.parse() 是更好的选择。
  • 路人注意:这是一个很好的在线工具,可以检查您的 JSON 字符串是否有效:jsonlint.com
  • 不,不,不!使用 eval 来评估 JSON 是一个非常危险的想法。您是否 100% 确定不会有人将自己的代码注入您的字符串中?
  • 值得一提的是,没有 JSON 对象这样的东西。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    如果您想将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 对象。

    【讨论】:

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

    下面的例子就清楚了:

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

    【讨论】:

    • 使用eval()是危险的
    • @SimonB。你能详细说明一下吗?
    • @M.AlJumaily 见softwareengineering.stackexchange.com/questions/311507/… 并将您的问题带到下一次极客聚会上,以获得免费的热门话题。免费战斗的话是可以预料的。 :-Z
    • @SimonB。谢谢,我会仔细阅读的:)
    【解决方案6】:

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

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

    【讨论】:

    • 那是什么意思?你为什么要发布一个古老问题的答案?
    • 他们在前面的答案中所说的无助于参数值在字符串中包含双引号的情况。它需要用真正的双引号全局替换!我很难发现只是为了分享以防有人遇到同样的问题
    • Kay:我现在澄清了我的帖子,这是我第一次尝试提供帮助。请再看一遍帖子。您知道从服务器页面输出的引用内容对于 JSON.parse() 来说是一个真正的问题。
    【解决方案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 访问这些字段。

    更新:

    如果你的输出是undefined,那么你需要关注THIS answer。也许您的 json 字符串具有数组格式。您需要像这样访问 json 对象属性

    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
    

    【讨论】:

    • console.log 中的 jsonObject.count 返回未定义。我该怎么称呼它?
    • 不要使用 eval 来解析 JSON,尤其是当未知方可以发送数据时。一个函数可以被包裹在一个字符串中!
    【解决方案8】:

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

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

    这是一个如何获取值的示例:

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

    【讨论】:

      【解决方案9】:

      JSON.parse() 将传递给函数的任何 JSON 字符串转换为 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);
      

      【讨论】:

        【解决方案10】:

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

        例如...

        var response = '{"result":true , "count":1}';
        
        var parsedJSON = eval('('+response+')');
        
        var result=parsedJSON.result;
        var count=parsedJSON.count;
        
        alert('result:'+result+' count:'+count);
        

        【讨论】:

        • eval 无法处理以 HTML 形式返回的 json 字符串
        • 如果它是 html 编码的,它就不再是 JSON。
        • eval 需要有效的 javascript,而 JSON 可能不是,因此 eval 无法解析一些有效的 JSON 文本(例如,U+2028 在 JSON 中有效,在 javascript 中无效)。
        【解决方案11】:

        如果你喜欢

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

        您可以使用 (.) 点:

        通过 JsonObject 访问 JSON 元素
        JsonObject.result;
        JsonObject.count;
        

        【讨论】:

          【解决方案12】:

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

          【讨论】:

          • eval() 也可以编译和执行任何 javascript。因此,如果使用 eval(),您将面临潜在的安全问题。但是 json 解析器只会识别 json 字符串并将它们编译成 javascript 对象。
          【解决方案13】:

          一个简单的方法:

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

          【讨论】:

            【解决方案14】:

            如果你使用Dojo Toolkit

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

            【讨论】:

            • var j='[{ "name":"John", "age":30, "city":"New York"}, { "name":"George", "age" :48, "城市":"库塔伊西"}]'; var obj = JSON.parse(j);警报(obj.length); for(var i=0; i
            【解决方案15】:

            正如许多其他人所提到的,大多数浏览器都支持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(以及旧版本),但根据经验,大多数东西似乎都运行良好。

            【讨论】:

              【解决方案16】:

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

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

              【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-10
              • 2017-01-09
              • 2012-05-07
              • 2013-08-23
              • 2011-11-02
              • 1970-01-01
              • 2017-04-08
              相关资源
              最近更新 更多