JSON.Parse,'未捕获的SyntaxError:意外的令牌o
我从Web服务返回的JSON遇到问题。 它看起来像JSON缺乏引号,但是当我将引号添加到JSON时,出现错误。 这是错误消息:'未捕获的SyntaxError:意外的令牌o。 当我将stringlogging到控制台时:[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); }); });
这里是与string单引号相同的代码。 有用
//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>
但是当我尝试向string添加引号时,就像我在真实的代码中似乎需要的那样,它会失败:
//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); }); });
这是错误:日志string到控制台:[对象对象],[对象对象] data.js:809未捕获SyntaxError:意外的标记'
我很难过 任何帮助感激! 谢谢!
如果没有单引号,你正在创build一个包含两个对象的数组。 这是JavaScript自己的语法。 当您添加引号时,该对象(数组+ 2对象)现在是一个string。 您可以使用JSON.parse
将string转换为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"}];
而且,你的最后一个例子失败,因为你正在向JSONstring中添加文字单引号字符。 这是非法的。 JSON规范规定只允许使用双引号。 如果你要console.log
以下…
console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'"); //Logs: '[object Object],[object Object]'
您会看到它返回数组的string表示forms,它将被转换为以逗号分隔的列表,并且每个列表项都是对象的string表示forms,即[object Object]
。 请记住,JavaScript中的关联数组只是对象,每个键/值对都是一个属性/值。
为什么会这样呢? 因为你是以一个string"'"
,那么你试图将数组追加到数组中,它会请求string表示forms,然后再追加另一个string"'"
。
请不要混淆JSON和Javascript,因为它们是完全不同的东西。 JSON是一种人类可读的数据格式,旨在匹配创buildjavascript对象时使用的语法。 JSON是一个string。 Javascript对象不是,因此在代码中声明不包围引号。
看到这个小提琴: http : //jsfiddle.net/NrnK5/
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
它会创buildjson对象。 不需要parsing。
jsonStringQuotes = "'" + jsonStringNoQuotes + "'";
会返回'[object]'
这就是为什么(下)导致错误
var myData = JSON.parse(jsonStringQuotes);
你最后的例子是无效的JSON。 除了内部string,JSON中不允许使用单引号。 在第二个示例中,单引号不在string中,但用于显示开始和结束。
有关规范,请参阅http://www.json.org/ 。
应该补充一下:你为什么这样想:“就像我真的需要在我的真实代码中”? 那么也许我们可以帮你拿出解决scheme。
也许来自服务器的已经被评估为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对象转换为JSONstring,则可以使用JSON.stringify
:
var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; var jsonString = JSON.stringify(json);
但在这种情况下,我不明白为什么你不能只是采取json
variables和引用它,而不是string化和parsing。