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 对象有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

json和geojson有啥区别

JAVA对象转换成JSON字符串与JAVA String有啥区别

python对象和json对象有啥区别?

Javascript中的对象和地图对象有啥区别? [复制]

json.dumps 和 json.load 有啥区别? [关闭]

JavaScript 中的字符串原语和字符串对象有啥区别?