JSON.Parse,'未捕获的SyntaxError:意外的令牌o

时间:2013-10-08 04:39:30

标签: javascript json

我遇到了从Web服务返回的JSON的问题。看起来JSON缺少引号,但是当我向JSON添加引号时,我收到错误。以下是错误消息:'Uncaught SyntaxError:Unexpected token o。当我将字符串记录到控制台时:[object Object],[object Object]

以下是一些模拟错误的示例代码:

//Error I am trying to solve
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
var myData = JSON.parse(jsonString);

$(document).ready(function() {
    var $grouplist = $('#groups');
    $.each(myData, function() {
        $('<li>' + this.Name + '</li>').appendTo($grouplist);
    });
});

这是与字符串周围的单引号相同的代码。它的工作原理

//Successful Javascript
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
var myData = JSON.parse(jsonString);

$(document).ready(function() {
    var $grouplist = $('#groups');
    $.each(myData, function() {
        $('<li>' + this.Name + '</li>').appendTo($grouplist);
    });
});

//Successful HTML
<ul id="groups"></ul>

但是当我尝试在字符串中添加引号时,就像我似乎需要在我的实际代码中一样,它失败了:

//Does not work when I need to append quotes to the string:
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
jsonStringQuotes = "'" + jsonStringNoQuotes + "'";
var myData = JSON.parse(jsonStringQuotes);

$(document).ready(function() {
    var $grouplist = $('#groups');
    $.each(myData, function() {
        $('<li>' + this.Name + ',' +  this.Id + '</li>').appendTo($grouplist);
    });
});

这是错误: 记录到控制台的字符串:[object Object],[object Object] data.js:809 Uncaught SyntaxError:意外的标记'

我很难过。任何帮助赞赏!谢谢!

4 个答案:

答案 0 :(得分:64)

如果没有单引号,则表示您正在创建一个包含两个对象的数组。这是JavaScript自己的语法。添加引号时,该对象(数组+2个对象)现在是一个字符串。您可以使用JSON.parse将字符串转换为JavaScript对象。您无法使用JSON.parse将JavaScript对象转换为JavaScript对象。

//String - you can use JSON.parse on it
var jsonStringNoQuotes = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';

//Already a javascript object - you cannot use JSON.parse on it
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];

此外,您的上一个示例失败,因为您要向JSON字符串添加文字单引号字符。这是非法的。 JSON规范声明只允许双引号。如果您要console.log以下......

console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'");
//Logs:
'[object Object],[object Object]'

您会看到它返回数组的字符串表示形式,并将其转换为逗号分隔列表,每个列表项都是对象的字符串表示形式,即[object Object]。请记住,javascript中的关联数组只是对象,每个键/值对都是属性/值。

为什么会这样?因为你是从一个字符串"'"开始的,所以你试图将数组附加到它,它请求它的字符串表示,然后你附加另一个字符串"'"

请不要将JSON与Javascript混淆,因为它们完全不同。 JSON是一种人类可读的数据格式,旨在匹配创建javascript对象时使用的语法。 JSON是一个字符串。 Javascript对象不是,因此在代码中声明时不会用引号括起来。

看到这个小提琴: http://jsfiddle.net/NrnK5/

答案 1 :(得分:2)

var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];

它将创建json对象。无需解析。

jsonStringQuotes = "'" + jsonStringNoQuotes + "'";

将返回'[object]'

这就是为什么它(下面)导致错误

var myData = JSON.parse(jsonStringQuotes);

答案 2 :(得分:1)

您的上一个示例是无效的JSON。除了字符串内部,JSON中不允许使用单引号。在第二个示例中,单引号不在字符串中,但用于显示开始和结束。

有关规范,请参阅http://www.json.org/

应该补充:你为什么这么认为:“就像我似乎需要在我的真实代码中”?那么也许我们可以帮助您提出解决方案。

答案 3 :(得分:1)

也许来自服务器的内容已被评估为JSON对象?例如,使用jQuery get方法:

$.get('/service', function(data) {  
  var obj = data;

      /* 
         "obj" is evaluated at this point if server responded 
         with "application/json" or similar.
       */
      for (var i = 0; i < obj.length; i++) {
        console.log(obj[i].Name);
      }
    });

或者,如果您需要将JSON对象转换为JSON字符串文字,则可以使用JSON.stringify

var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
var jsonString = JSON.stringify(json);

但在这种情况下,我不明白为什么你不能只使用json变量并引用它而不是字符串化和解析。