JSON.Parse,'Uncaught SyntaxError: Unexpected token o
我无法处理从Web服务返回的JSON。看起来JSON缺少引号,但是当我向JSON添加引号时,会得到一个错误。以下是错误消息:"未捕获语法错误:意外的标记O。当我将字符串记录到控制台时:【对象对象对象】、【对象对象对象】
下面是一些模拟错误的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //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); }); }); |
这里是字符串周围带单引号的相同代码。它工作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //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> |
但是,当我尝试向字符串添加引号时,就像我在实际代码中需要的那样,它失败了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //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); }); }); |
错误如下:将字符串记录到控制台:[对象对象],[对象对象对象]data.js:809未捕获语法错误:意外标记'
我被难住了。感谢您的帮助!谢谢您!
Without single quotes around it, you are creating an array with two objects inside of it. This is JavaScript's own syntax. When you add the quotes, that object (array+2 objects) is now a string. You can use
1 2 3 4 5 | //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规范规定只允许双引号。如果你去
1 2 3 | console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'"); //Logs: '[object Object],[object Object]' |
您将看到它返回数组的字符串表示形式,该数组转换为逗号分隔的列表,并且每个列表项都是对象的字符串表示形式,即
为什么会这样?因为您是从一个字符串
请不要将JSON与JavaScript混淆,因为它们完全不同。JSON是一种人类可读的数据格式,旨在与创建JavaScript对象时使用的语法相匹配。JSON是一个字符串。JavaScript对象不是,因此在代码中声明时,不会用引号括起来。
看这个小提琴:http://jsfiddle.net/nrnk5/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var jsonStringNoQuotes = [{"Id":"10","Name":"Matt <div class="suo-content">[collapse title=""]<ul><li>我不认为将数组包装成单引号将为您提供该数组的字符串文本。它更愿意给您提供类似于<wyn>'[object], [object]'</wyn>的东西,这显然对解析没有意义。使用<wyn>JSON.stringify</wyn>。</li><li>我就是这么说的……请再看一遍我的答案</li><li>对不起,我错过了"不需要解析"中的"否"(这里是清晨)。您可能应该纠正<wyn>'[object]'</wyn>输出,因为这不是这个特定数组的表示方式(很抱歉,这是学究式的,但如果您所写的内容实际上是他们能够发现自己的东西,这会使人们更容易理解您的解决方案)。</li></ul>[/collapse]</div><p><center>[wp_ad_camp_1]</center></p><hr> <p> Maybe what comes from the server is already evaluated as JSON object? For example, using jQuery get method: </p> [cc lang="javascript"]$.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。除了字符串内部之外,JSON中不允许使用单引号。在第二个示例中,单引号不在字符串中,而是用来显示开始和结束。
规范见http://www.json.org/。
应该补充一句:为什么你会这样认为:"就像我在我真正的代码中需要的那样"?也许我们可以帮你想出解决办法。