我遇到了从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:意外的标记'
我很难过。任何帮助赞赏!谢谢!
答案 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
变量并引用它而不是字符串化和解析。