40

我遇到了从 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: Unexpected token '

我难住了。任何帮助表示赞赏!谢谢!

4

4 回答 4

67

如果没有单引号,您将创建一个包含两个对象的数组。这是 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 中的关联数组只是对象,每个键/值对都是一个属性/值。

为什么会这样?因为您从一个 string 开始"'",然后您尝试将数组附加到它,这请求它的字符串表示,然后您正在附加另一个 string "'"

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

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

于 2013-10-08T04:55:56.120 回答
2
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];

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

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

将返回“[对象]”

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

var myData = JSON.parse(jsonStringQuotes);
于 2013-10-08T04:44:00.783 回答
1

您的最后一个示例是无效的 JSON。JSON 中不允许使用单引号,字符串中除外。在第二个示例中,单引号不在字符串中,而是用于显示开始和结束。

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

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

于 2013-10-08T04:43:51.197 回答
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变量并引用它而不是字符串化和解析。

于 2013-10-08T04:55:36.150 回答