Javascript 相同输入的json.parse的不同行为?
这个问题是关于 为什么输出不同 我不知道如何才能获得正确的输出 即使我给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)); 调试 第二种
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”}