JSON 和 JavaScript 对象有啥区别? [复制]
Posted
技术标签:
【中文标题】JSON 和 JavaScript 对象有啥区别? [复制]【英文标题】:What are the differences between JSON and JavaScript object? [duplicate]JSON 和 JavaScript 对象有什么区别? [复制] 【发布时间】:2011-04-27 21:54:49 【问题描述】:我是 JSON 和 javascript 对象的新手。
谁能解释一下 JSON 和 JavaScript 对象之间的区别? 它们有什么用途? 一种比另一种更好吗?还是视情况而定? 什么时候使用哪个,在什么情况下? 为什么首先创建 JSON?它的主要目的是什么? 谁能举例说明何时应该使用 JSON 而不是 JavaScript 对象,反之亦然?【问题讨论】:
请一次一个问题。 @LightnessRacesinOrbit 不错的尝试 @FélixGagnon-Grenier 谢谢 【参考方案1】:首先你应该知道 JSON 是什么:
它是语言无关的数据交换格式。JSON 的语法受 JavaScript Object Literal 表示法的启发,但它们之间存在差异。
例如,在 JSON 中,所有的 keys 都必须被引用,而在对象字面量中,这不是必需的:
// JSON:
"foo": "bar"
// Object literal:
var o = foo: "bar" ;
引号在 JSON 中是强制性的,因为在 JavaScript 中(更准确地说是在 ECMAScript 3rd. Edition 中),不允许使用 保留字 作为属性名称,例如:
var o = if: "foo" ; // SyntaxError in ES3
虽然,使用字符串文字作为属性名(引用属性名)没有问题:
var o = "if": "foo" ;
所以对于“兼容性”(也许是简单的评估?)引号是强制性的。
JSON 中的数据类型也限制为以下值:
string
number
object
array
文字为:
true
false
null
Strings
的语法发生了变化。它们必须用双引号分隔,而在JavaScript中,您可以互换使用单引号或双引号。
// Invalid JSON:
"foo": 'bar'
Numbers
接受的 JSON 语法也发生了变化,在 JavaScript 中,您可以使用十六进制文字,例如 0xFF
,或(臭名昭著的)八进制文字,例如010
。在 JSON 中,您只能使用十进制文字。
// Invalid JSON:
"foo": 0xFF
有一些错误的实现(Firefox 3.5+、IE8+、json2.js)错误地允许使用八进制文字,例如JSON.parse('01')
应该产生一个SyntaxError
。
【讨论】:
+1 很好的答案,但可以强调子集:任何有效的 JSON 声明也是有效的 JavaScript 声明,但并非所有有效的 JavaScript 声明都是 JSON 声明。 也有助于演示我们在 Javascript 文件中看到 JSON 的唯一方式;即在字符串内。 @DanielEarwicker:并非所有有效的 JSON 都一定是 javascript 中的有效对象表达式:timeles-s-repo.com/json-isnt-a-javascript-subset 某些 unicode 空白字符在 json 字符串中有效,但在 javascript 中无效。 @EamonNerbonne - 如该页面所述,在它(很少)导致问题的唯一情况下非常容易修复。 这是一个潜在的 crashbug 问题,如果攻击者嵌入\u2028
字符并且您的(有效的)json 序列化程序没有转义它们(因为没有必要),那么任何包含 json 的页面文字并将其评估为 JS 对象可能会遇到异常。很容易修复;在序列化程序级别,但它不是一个适当的子集是一个痛苦 - 然后你可以可靠地在 javascript 中嵌入(有效)json 而没有风险。这主要是烦人,仅此而已 - 授予:-)。【参考方案2】:
JSON 是对象的字符串表示形式。它是一种可互操作的序列化格式。它不仅与 javascript 相关联。例如,.NET 的 JSON 序列化程序允许您序列化/反序列化 .NET 对象。
所以它只是一种允许您从对象转换为字符串并返回的格式,如果您想通过网络传输它们,这很方便。
它非常接近于 javascript 对象表示,如果你只是 eval()
一个 JSON 字符串,你会得到相应的对象。
【讨论】:
别让 Crockford 听到你这么说...... @nickf,Crockford 的 json2.js 库就是这样做的,eval
经过一些“正则表达式验证”后,它不会做任何 解析 :P。事实上,即使是他的自己的库也与his own RFC!有一些偏差,例如json2.js可以错误地“解析”八进制文字,例如:JSON.parse("01")
...我觉得很有趣: P
@CMS 好吧,我猜道格会反对“简单地 eval()
”这个短语然后......(没有正则表达式验证等)
所以如果我只是用 JavaScript 编写一个需要使用对象的程序,我不应该使用 JSON,因为我没有将对象发送到其他地方?
Not all JSON strings are valid JS【参考方案3】:
JSON 是一种数据交换格式,它恰好看起来像 YAML 或 JavaScript 代码的子集,您可以执行并取回对象。 JavaScript 对象只是 JavaScript 中的一个对象。
由于 JSON 是一种数据交换格式,您可以使用它交换文本形式的结构化数据。到目前为止,它已经与 JavaScript 完全解耦了。 JavaScript 对象允许您在 JavaScript 程序执行期间创建和使用结构化数据。
【讨论】:
以上是关于JSON 和 JavaScript 对象有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
JAVA对象转换成JSON字符串与JAVA String有啥区别