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); 

但在这种情况下,我不明白为什么你不能只是采取jsonvariables和引用它,而不是string化和parsing。