解析JSON时出现“unexpected token o”错误

456

我在解析简单的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()对我的字符串进行编码。


3
改为:var ques_list = JSON.stringify(cur_ques_details); 谢谢。 - Y. Joy Ch. Singha
8个回答

811

您的数据已经是一个对象了,不需要解析它。Javascript解释器已经为您解析过了。

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

12
如何在 jQuery 中检测数据是否已经是有效的 JSON 对象? - mko
2
@mko:在这种情况下,你不需要。你知道它是或者不是。看一下它是否符合JSON规范。 - Dark Falcon
5
我会尽力为您翻译以下内容:@DarkFalcon 我选择使用 if (typeof data == 'object') { dostuff } 语句来检查数据是否为 JSON 对象,而不是普通字符串。 - mko
2
请注意,JSON是JavaScript对象表示法,因此在JavaScript源代码中的字面JSON只是JS对象。我们借用了JavaScript的对象语法来在编程语言之间传输数据,因为它很容易使用。 - Filip Haglund
3
除了 JSON 的语法比 JS 对象的语法严格外,例如,JS 允许未引用的属性名称,而 JSON 不允许。 - Dark Falcon
非常感谢您的答案。我一晚上都在寻找这个! - David

72

尝试使用以下方式进行解析:

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

这对我进行调试非常有用。非常感谢。我意识到我从控制器中输出了额外的不必要信息。 - Pathros
1
为什么要使用 jQuery - Geoffrey Hale
3
为什么不使用JSON.parse - Geoffrey Hale

14

使用 JSON.stringify(data);

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

1
仅仅调用 JSON.stringify 并不会对你的数据产生任何影响,该函数实际上返回了你现在序列化后的数据。 - Tom Hofman

11

您的错误源在于需要将完整的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>

10

cur_ques_details已经是一个JS对象,不需要对其进行解析。


8
“JSON对象”并不存在。JSON是一个字符串。你所说的应该是“JS对象”。 - Joseph
4
我认为他的意思是“JavaScript对象”。 - raffi

6

响应已经被解析,您不需要再次解析它。如果您再次进行解析,它将会给出“unexpected token o”。如果您需要将其作为字符串获取,可以使用JSON.stringify()


6

当我使用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 方法。

1
我看到了“意外的令牌o”错误,因为我的(不完整的)代码之前已经运行过(实时重载!),并将特定的键控本地存储值设置为“[object Object]”而不是“{}”。只有当我更改键后,事情才开始按预期工作。或者,您可以按照这些说明中的指示删除错误设置的localStorage值。

我有同样的[object Object]问题,我的问题是我没有存储普通对象而是存储了DOM对象。所以,我通过从DOM对象中提取有用的值并将它们存储在一个对象中来解决这个问题,之后我将该对象转换为JSON。然后,为了获取该值,我解析了JSON对象。 - Waleed Naveed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接