【问题标题】:Parsing JSON giving "unexpected token o" error [duplicate]解析 JSON 给出“意外的令牌 o”错误 [重复]
【发布时间】:2013-03-15 01:45:44
【问题描述】:

我在解析简单的 JSON 字符串时遇到问题。我在JSONLint 上检查了它们,它表明它们是有效的。但是,当我尝试使用 JSON.parse 或 jQuery 替代方法解析它们时,它给了我错误 unexpected token o:

<!doctype HTML>
<html>
  <head>
  </head>
  <body>
    <script type="text/javascript">
      var cur_ques_details ={"ques_id":15,"ques_title":"jlkjlkjlkjljl"};
      var ques_list = JSON.parse(cur_ques_details);

      document.write(ques_list['ques_title']);
    </script>
  </body>
</html>

注意:我在 PHP 中使用 json_encode() 对字符串进行编码。

【问题讨论】:

  • 将其更改为:var ques_list = JSON.stringify(cur_ques_details);谢谢。

标签: javascript json


【解决方案1】:

您的数据已经是一个对象。无需解析它。 javascript 解释器已经为你解析好了。

var cur_ques_details ={"ques_id":15,"ques_title":"jlkjlkjlkjljl"};
document.write(cur_ques_details['ques_title']);

【讨论】:

  • 如何从jquery中检测数据是否已经是一个有效的json对象?
  • @mko:在这种情况下,你不需要。你知道它是或者你不知道。看看它是否符合 JSON 规范。
  • @DarkFalcon 我用 if (typeof data == 'object') { dostuff } 检查它是 json 对象还是纯字符串
  • 请注意,JSON 是 JavaScript 对象表示法,因此 javascript 源代码中的 litteral JSON 只是一个 JS 对象。我们借用了 Javascript 的对象语法在编程语言之间进行数据传输,因为它易于使用。
  • @FilipHaglund:除了 JSON 的语法比 JS 对象的语法严格得多。例如,JS 允许不带引号的属性名称,而 JSON 不允许。
【解决方案2】:

尝试这样解析:

var yourval = jQuery.parseJSON(JSON.stringify(data));

【讨论】:

  • 这对我有用。非常感谢。我意识到我正在从我的控制器中回显多余的不必要的信息。
  • 为什么使用jQuery
  • 为什么不使用JSON.parse
【解决方案3】:

使用JSON.stringify(data);

$.ajax({
    url: ...
    success:function(data){
        JSON.stringify(data); //to string
        alert(data.you_value); //to view you pop up
    }
});

【讨论】:

  • 只调用JSON.stringify 不会对您的数据做任何事情,该函数实际上会返回您的 now 序列化数据。
【解决方案4】:

但是,您的错误来源是您需要将完整的 JSON 字符串放在引号中。以下将修复您的示例:

<!doctype HTML>
<html>
    <head>
    </head>
    <body>
        <script type="text/javascript">
            var cur_ques_details ='{"ques_id":"15","ques_title":"jlkjlkjlkjljl"}';
            var ques_list = JSON.parse(cur_ques_details);
            document.write(ques_list['ques_title']);
        </script>
    </body>
</html>

正如其他受访者所提到的,该对象已经解析为 JS 对象,因此您无需解析它。为了演示如何在不解析的情况下完成相同的事情,您可以执行以下操作:

<!doctype HTML>
<html>
<head>
</head>
    <body>
        <script type="text/javascript">
            var cur_ques_details ={"ques_id":"15","ques_title":"jlkjlkjlkjljl"};
            document.write(cur_ques_details.ques_title);
        </script>
    </body>
</html>

【讨论】:

    【解决方案5】:

    cur_ques_details已经是一个JS对象,不需要解析

    【讨论】:

    • 没有“JSON 对象”这样的东西。 JSON 是一个字符串。你的意思是一个“JS对象”。
    • 我认为他的意思是“Javascript对象”
    【解决方案6】:

    响应已经被解析,你不需要再次解析它。如果你再次解析它,它会给你“unexpected token o”。如果你需要把它作为字符串,你可以使用JSON.stringify()

    【讨论】:

      【解决方案7】:

      我在使用 jQuery AJAX 提交数据时遇到了同样的问题:

      $.ajax({
         url:...
         success:function(data){
            //server response's data is JSON
            //I use jQuery's parseJSON method 
            $.parseJSON(data);//it's ERROR
         }
      });
      

      如果响应是 JSON,并且你使用这个方法,你得到的数据是一个 JavaScript 对象,但是如果你使用dataType:"text",数据是一个 JSON 字符串。那么$.parseJSON的使用就可以了。

      【讨论】:

        【解决方案8】:

        我看到这个unexpected token o 错误是因为我的(不完整的)代码之前已经运行过(实时重新加载!)并将特定的键控本地存储值设置为[object Object] 而不是{}。直到我换了钥匙,事情才开始按预期工作。或者,您可以关注these instructions to delete the incorrectly set localStorage value

        【讨论】:

        • 我遇到了与[object Object] 相同的问题,我的问题是我没有存储普通对象,而是存储了 DOM 对象。所以,我通过从 DOM 对象中提取有用的值并将它们存储在一个对象中来完成它,然后我将该对象转换为 JSON。然后为了获取值,我解析了那个 JSON 对象。
        猜你喜欢
        • 2015-10-27
        • 2016-12-18
        • 2013-09-26
        • 1970-01-01
        • 2022-01-12
        • 2015-08-28
        • 1970-01-01
        相关资源
        最近更新 更多