Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 相同输入的json.parse的不同行为?_Javascript_Json_String - Fatal编程技术网

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

Javascript 相同输入的json.parse的不同行为?,javascript,json,string,Javascript,Json,String,这个问题是关于 为什么输出不同 我不知道如何才能获得正确的输出 即使我给JSON.parse()函数提供了相同的参数,我也无法理解为什么以下两个场景的输出不相同 第一种情况 obj = {a:"asdf"}; var newObj = JSON.parse(JSON.stringify(obj)); //newObj = {a:"asdf"} obj = {a:"asdf"}; var newObj = JSON.parse(JSON.stringify(obj)); 调试 第二种

这个问题是关于

为什么输出不同

我不知道如何才能获得正确的输出

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

第一种情况

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

第二种情况

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

问题在于引用

var newObj = JSON.parse('{"a":"asdf"}');
应该能正常工作

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

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

你可能会这么想

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

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

问题在于引号

var newObj = JSON.parse('{"a":"asdf"}');
var newObj = JSON.parse('{"a":"asdf"}');
应该能正常工作

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

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

你可能会这么想

var newObj = JSON.parse("{'a':'asdf'}");
可以,但不行。在JSON中,字符串仅使用双引号定义

var newObj = JSON.parse('{"a":"asdf"}');
为什么输出不同

因为输入是不同的

第一种情况

obj = {a:"asdf"};
var newObj = JSON.parse(JSON.stringify(obj));     //newObj = {a:"asdf"}
obj = {a:"asdf"};
var newObj = JSON.parse(JSON.stringify(obj));
这里,
JSON.parse
的输入参数是
JSON.stringify(obj)
,这是一个读取
{“a”:“asdf”}
的字符串

第二种情况

var newObj = JSON.parse("{"a":"asdf"}");        //this gives an error
var newObj = JSON.parse("{"a":"asdf"}");
这里,
JSON.parse
的输入参数是一个读取
{
的字符串,其余为断开的代码

出现混淆的原因是,控制台调试器决定所有字符串都应显示在控制台上,并用
”封装,但这只是控制台告诉您该值为String类型的一种方式。它不会检查是否有“inner”并转义它们

封装的
不是字符串的一部分,只是告诉它是字符串的一种方式

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


函数JSONparse(字符串){
document.write(字符串);
警报(字符串);
console.log(字符串);
返回JSON.parse(字符串);
}
var obj={a:“asdf”};
result=JSONparse(JSON.stringify(obj));
为什么输出不同

因为输入是不同的

第一种情况

obj = {a:"asdf"};
var newObj = JSON.parse(JSON.stringify(obj));     //newObj = {a:"asdf"}
obj = {a:"asdf"};
var newObj = JSON.parse(JSON.stringify(obj));
这里,
JSON.parse
的输入参数是
JSON.stringify(obj)
,这是一个读取
{“a”:“asdf”}
的字符串

第二种情况

var newObj = JSON.parse("{"a":"asdf"}");        //this gives an error
var newObj = JSON.parse("{"a":"asdf"}");
这里,
JSON.parse
的输入参数是一个读取
{
的字符串,其余为断开的代码

出现混淆的原因是,控制台调试器决定所有字符串都应显示在控制台上,并用
”封装,但这只是控制台告诉您该值为String类型的一种方式。它不会检查是否有“inner”并转义它们

封装的
不是字符串的一部分,只是告诉它是字符串的一种方式

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


函数JSONparse(字符串){
document.write(字符串);
警报(字符串);
console.log(字符串);
返回JSON.parse(字符串);
}
var obj={a:“asdf”};
result=JSONparse(JSON.stringify(obj));

在调试器中得到的提示给您带来了混乱。即使您看到
“{”a:“asdf”}”
这不是一个格式正确的字符串。如果您以“然后以”开头字符串,这意味着这里的字符串仅为“{”其余的都是坏代码,浏览器不知道该怎么处理。正如在回答中所说的,你可以使用“将整个字符串封装为”{code>“{a”:“asdf”},也可以使用内部的“As
”{a\”:“asdf\”}
。我理解你想说什么,但是--JSON.stringify(obj)-返回“{”a:“asdf”}“仅此而已,那么它在这种情况下是如何工作的。-JSON.parse(JSON.stringify(obj))它不工作。浏览器在控制台中以
“{”a:“asdf”}”
的形式输出它,但它实际上返回一个读取
{”a:“asdf”}
的字符串。浏览器控制台决定将其封装在“因为这是字符串的默认控制台行为。因此您将阅读
”{“a”:“asdf”}
,但它实际上是一个类型字符串,值为
{“a”:“asdf”}
。但这样做--JSON.parse({“a”:“asdf”})--也给出了一个错误。因为传递给JSON.parse的参数是一个对象,而不是字符串。这就是为什么您应该执行
JSON.parse(“{”a:“asdf”}”)
。检查我的答案,我尝试在那里解释。调试器中得到的提示给您带来了困惑。即使在那里您看到
“{”a:“asdf”}”
这不是一个格式正确的字符串。如果以“然后以”开头字符串,则以“{”结尾。这意味着,这里的字符串仅为“{”,其余为断开的代码,浏览器不知道如何处理。如回答中所述,您可以使用“将整个字符串封装为
”{“a”:“asdf”}”
或转义内部代码“as
”{\“a\”:\“asdf\”}“
。我理解您的意思,但是--JSON.stringify(obj)-只返回“{”a:“asdf”}”,那么它在这种情况下是如何工作的。-JSON.parse(JSON.stringify(obj))它没有。浏览器在控制台中将其输出为
“{”a:“asdf”}
,但它实际上返回的是一个读取
{a:”的字符串“asdf”}