json.parse的相同输入的不同行为?

时间:2016-11-04 10:46:58

标签: javascript json string

这个问题是关于

  

为什么输出不同

不是如何才能实现正确的输出。

我无法理解为什么以下两个场景的输出不一样,即使我给JSON.parse()函数提供了相同的参数。

第一种情况

obj = {a:"asdf"};
var newObj = JSON.parse(JSON.stringify(obj));     //newObj = {a:"asdf"}

调试 Debugging view

第二种情况

var newObj = JSON.parse("{"a":"asdf"}");        //this gives an error

3 个答案:

答案 0 :(得分:3)

问题在于引号。

var newObj = JSON.parse('{"a":"asdf"}');

应该可以正常工作。

在Javascript中,我们使用引号(单引号或双引号)来表示String。如果要定义包含引号的String,则必须使用不同的引号,或使用反斜杠escape字符\引号。

var newObj = JSON.parse("{\"a\":\"asdf\"}");

也可以。

你可能会认为

var newObj = JSON.parse("{'a':'asdf'}");

可行,但不行。在JSON中,字符串仅使用双引号定义。

答案 1 :(得分:1)

  

为什么输出不同

因为输入不同。

第一种情况

obj = {a:"asdf"};
var newObj = JSON.parse(JSON.stringify(obj));

此处JSON.parse的输入参数为JSON.stringify(obj),这是一个读取{"a":"asdf"}的字符串。

第二种情况

var newObj = JSON.parse("{"a":"asdf"}");

此处JSON.parse的输入参数是一个读取{的字符串,其余部分是破解的代码。

出现混乱是因为控制台调试器决定应该在用"封装的控制台上显示所有字符串,但这只是控制台告诉您该值为String类型的一种方式。它不会检查你是否“在里面并逃脱它们。

封装"不是字符串的一部分,只是告诉它是一个字符串。

如果console.logging JSON.stringify(obj)让你"{"a":"asdf"}"尝试做警告,或者是document.write。这些不会添加额外的",您会看到JSON.stringify(obj)的值实际上是{"a":"asdf"},而不是"{"a":"asdf"}"

<html><head></head><body>
<script>
function JSONparse(string) {
    document.write(string);
    alert(string);
    console.log(string);
    return JSON.parse(string);
}
var obj = {a:"asdf"};
result = JSONparse(JSON.stringify(obj));
</script>
</body></html>

答案 2 :(得分:0)

var newObj = JSON.parse('{"a":"asdf"}');