关于javascript:JSON.Parse,’未捕获的SyntaxError:意外的令牌o

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 JSON.parse to convert a string into a JavaScript object. You cannot use JSON.parse to convert a JavaScript object into a JavaScript object.

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规范规定只允许双引号。如果你去console.log以下…

1
2
3
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
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.stringify

[cc lang="javascript"]var json = [{"Id":"10","Name":"Matt


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

规范见http://www.json.org/。

应该补充一句:为什么你会这样认为:"就像我在我真正的代码中需要的那样"?也许我们可以帮你想出解决办法。