JSON Object vs Javascript object
我是JS和JSON的新手,并试图了解其中的差异,我看到其他线索有这个差异,但仍然没有几个未解决的问题,
我创建了3个对象
双引号中的键 - 对
没有引号的键但带引号的值
单引号中的键值对。
问题。
Asis,如果所有3个对象都是Javascript对象,可以安全地假设吗?
如何确定哪一个是JSON对象,当我在日志中打印对象时,所有对象看起来都相同。 有没有办法确定JSON对象?
如果JSON对象 - 键值对用双引号括起来,那么单引号是什么意思?
码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <html>
<head>
var jsobject = {"fname":"Bob","lname":"Mike"}
console.log(jsobject)
var jsobject = {fname:"Bob",lname:"Mike"}
console.log(jsobject)
var jsobject = {'fname':'Bob','lname':'Mike'}
console.log(jsobject)
</head>
<body>
</body>
</html> |
-
@susheel:有很大的不同。他们碰巧使用重叠语法。
-
1)是的,所有3个都是JavaScript对象。 2)对于JavaScript,JSON是一个String表示,这就是JSON.stringify()返回String而JSON.parse()需要String的原因。 3)在JavaScript对象文字/初始化器中,标识符,数字以及单引号和双引号字符串都可以用作键。 JSON使用更严格的语法,只允许使用双引号字符串。
-
您的代码中没有任何JSON,只有三种不同但等效的对象文字格式。只有静态代码分析才能发现差异。 JSON使用JSON.parse / eval上线,我在这里看不到类似的东西......
-
在您的示例中,第一个Object也是有效的JSON字符串。第二个和第三个示例是有效的对象,但是无效的JSON字符串,因为键和值不包含在双引号中。
-
有人可以用清楚的方式回答......这一切都令人困惑。用一些例子
-
@CodyBonney重要的区别在于,如果用引号括起来,第一个对象将是一个有效的JSON字符串。或者,换句话说,它的JSON表示与用于创建它的对象表示法相同。
-
X = 5; X = + '5'; X = 0x5的;一切都是相同的,即使一个看起来像其他东西。
-
@Juhana:如果你在第一个附近包装引号,那将是语法错误,而不是JSON。
-
@dandavis单引号。
-
@susheel你不明白什么?几乎不可能比Jonathan的评论更好地解释它。
-
我在这里找到了benalman.com/news/2010/03/theres-no-such-thing-as-a-json
-
您可能知道,JSON代表JavaScript Object Notation,它已经是一个JavaScript对象。没有区别,但就双引号和单引号而言,从它的Javascript方面来说没有区别,但如果你想send它作为查询字符串你最好使用双引号,因为js encodeURI()和encodeURIComponent不要逃避单引号
-
@Juhana感谢你提起这件事。我应该更好地评论我的评论。
-
susheel:是的,这是一个很好的阅读。 @MehranHatami你的意思是"没有区别"? JSON是字符串形式的序列化数据,与JS对象完全不同。
-
并且您也可以不为键使用引号,但如果您的键不符合JavaScript变量命名约定,例如,如果您的键是js中的保留关键字,则必须使用引号。
-
@Fabrcio Matt:正如我之前所说的,JSON代表JavaScript Object Notation,并且使用JSON作为协议来发送和接收数据的想法不仅源于js对象,而且它们是相同的。多年来,在有人提出这个想法之前,我们一直在js中使用JSON。合理?
-
@MehranHatami No.符号类似 - 确定它基于JS对象表示法,但术语"JSON"指的是定义JS对象表示法的更严格子集的规范。 JSON用作数据交换语言,只能出现在字符串上下文中。我建议阅读susheel发送的链接,这很有启发性:没有"JSON对象"这样的东西
-
@Fabrcio Matt:'JSON被用作数据交换语言',这是正确的,我读了那个链接,对于那些已经开始使用JSON的服务器端视角的人来说,这是没有意义的。我仍然坚持这个,这个符号不仅仅是相似的,它完全是一样的。
-
@MehranHatami我不想进一步扩展这一点,但是,它们并非"完全相同"。例如:{ unquotedProp: 42 }是一个有效的JS对象但不是有效的JSON(必须引用所有JSON字符串),{"fun": function(){} }是有效的JS对象但不是有效的JSON(JSON没有定义"函数"类型)等等。是JS对象表示法的更严格的子集,这意味着任何JSON字符串都可以用作对象文字,但不是相反。
-
此外,我不确定你的意思是"对于那些已经开始在服务器端使用JSON的人来说,它没有意义"。让我们假设一个PHP后端向Ajax调用输出JSON响应:echo json_encode(array('hello'=>'world')); - 显然后端正在输出一个字符串,接收端必须解析它(使用JSON.parse(),除非您正在使用jQuery.ajax(),它会在将JSON响应传递给回调之前自动将其解析为对象)。
-
@Fabrcio Matt:考虑反过来,{"unquotedProp":"42" },是一个有效的JSON对象,并且所有JSON对象始终是有效的JS对象,引号是为了确保防止js引擎出现异常。顺便说一下,我真的很喜欢这个简短的讨论,让我们过来。
-
@MehranHatami在这里一样。 =]请记住,为了检查某些东西是否是有效的JSON,您应该将其包含在字符串中并将其传递给JSON.parse(),或者更好的是,将其粘贴到jsonlint.com
-
@Fabrcio Matt:当我说"对于那些已经开始使用JSON ......"时,我的意思是作为一个古老的原始javascript开发人员,我一直在使用JSON,远远超过它成为a data interchange language,对于那些没有这样做,这是不合理的。我想,那太多了,让我们完成吧。
-
听起来很公平,我有类似的背景,我可以在那里同意,虽然现在我想知道 - 假设有人没有JS的经验,也许他/他不会混淆JSON与文字对象?我的意思是,它不会只是看起来像普通的序列化数据?好的,这就够了。 :P
我认为你的语法和数据令人困惑。
任何数量的技术可以具有非常相似的语法,但是类似的语法可以用于完全不同的目的,并且用于创建极其不同的数据。
当我们谈论JSON时,我们讨论的是具有Unicode编码的文本数据,该编码遵循用作数据传输机制的字符语法。可以将JSON数据传输到各种不同的编程环境中,进行解析,然后转换为对环境有意义的实际对象结构。
它被命名为"JavaScript Object Notation"的原因在于它的符号主要是在JavaScript程序中用于创建对象和原始值的文字语法的子集之后形成的。遗憾的是,这种命名有助于JavaScript开发人员的混乱。
因此,要确定您是否正在处理JSON,最重要的是要考虑的是您所做的事情是否会导致创建遵循JSON语法规则的Unicode数据。
举个例子:
1
| var foo = {"bar":"baz"}; |
那是JSON吗?好吧,如果它在JavaScript程序中运行,它将被评估,foo将保存对某些非Unicode文本数据的内存的引用。
当然,我们可以隔离代码的{"bar":"baz"}部分,并将其转换为自己的编码为Unicode的文本文件,但是我们真的不再处理相同的示例了。
所以我们说我们做到了。我们打开文本编辑器,确保它已设置为Unicode编码,然后粘贴上面代码的一部分。所以现在整个文本文件都是这样的:
现在我们可以正确地说我们有JSON数据。如果我在末尾添加;怎么办?
它不再是JSON,因为它已被;破坏,这是不允许的。再说一遍,除了无效之外,我们可以将它称为JSON,但实际上它要么完全有效,要么完全无效。
回到JavaScript示例。在JavaScript程序的语法中引用JSON是否有意义?好吧,拿我们原来的例子。如果我们可以使用一些JavaScript语法来创建Unicode数据并使其符合JSON语法,那么是的,我们可以正确地谈到在我们的程序中使用JSON。
那么JavaScript让我们创建Unicode数据吗?是的,JavaScript中的所有字符串都是UTF-16编码的。因此,我们需要做的就是创建一个字符串。
1
| var foo = '{"bar":"baz"}'; |
现在我们不会调用整行JSON,但我们可以正确地说foo变量指的是保存JSON数据的内存。
然后我们可以将这些数据传输到用完全不同的编程语言编写的服务器,只要它有一个JSON解析器,它就可以解析它,并将其转换为对该服务器有意义的任何对象类型。