JS对象字面量和JSON字符串有何区别?

5

我对Object Literals、JSON和JavaScript Objects的确切含义感到困惑,它们看起来很相似:

{foo: 'bar', bar : 'baz'}

据我所知,上面是对象字面量,json和javascript对象,对吗?

对象字面量和json意思相同吗?

你们如何区分它们?


1
这个问题及其答案可能会有所帮助:JSON 和对象字面量表示法之间有什么区别? - Drew Gaynor
2
很少有人会手动创建JavaScript字符串来表示JSON结构。通常,如果JavaScript中有任何JSON数据,它将使用JSON.stringify()创建。将JSON视为解析为数据结构的标记。该标记可以发送到某些非JavaScript环境,并解析为对该环境有意义的任何数据结构。 - user1106925
2
换句话说,它是一种标准化的文本格式,用于在不同的编程环境之间传输数据。 - user1106925
让我给你举另一个例子:foo=42;baz=21。你认为这是什么?有人可能会认为这是两个JavaScript语句,将值分配给变量。但在我的(虚构的)情况下,这是CSV文件中的一行,使用;作为分隔符,与JavaScript(或任何其他语言)完全无关。这只是一种存储和表示数据的方式。这就是JSON的作用。 - Felix Kling
{foo: 'bar', bar : 'baz'} 可能是一个对象字面量或(无效的)JSON,这取决于它所在的位置。然而,它肯定不是JavaScript对象值 - 对象存在于内存中,而不是源代码中。 - Šime Vidas
谢谢大家,现在我完全明白了 :) - Dev555
6个回答

11
变量jsonString包含一个JSON字符串:
var jsonString = '{"foo": "bar", "bar" : "baz"}'
变量javascriptObject 包含一个 JavaScript 对象,使用对象字面量进行初始化:
var javascriptObject =  {foo: 'bar', bar : 'baz'}
你可以使用JSON.parse将JSON字符串转换为JavaScript对象,然后再使用JSON.stringify将其转换回去。

7
**JSON**只是一种数据格式,就像XML一样。真正的JSON应该将键用双引号括起来,如下所示:
{"foo":"bar"}

JavaScript对象是JavaScript语言的一部分,拥有原型等相关内容。

对象字面量是在代码中使用括号创建JavaScript对象,而不是使用new关键字或Object.create()方法。

//object literal
var foo = {};

//equivalent
var foo = new Object();

我喜欢这个答案,除了第一句话。仅凭这行代码,它既不是JSON也不是有效的JavaScript(或对象字面量)。对于JSON来说,它缺少键周围的引号,在JavaScript中,由于它不在表达式上下文中,{ }将被解释为块分隔符(而不是对象字面量指示符)。因此它不是三者之一,也不是两者之一。 - Felix Kling

4
据我了解,上面是对象字面量、json以及javascript对象,对吗?
这是一个对象字面量,它创建了一个对象。
它不是JSON,因为它的语法格式不符合JSON(JSON是对象字面量符号的子集)。键没有引号,并且值周围使用了错误种类的引号(使用了'而不是")。
区分它们的方法是通过上下文。JSON通常不会嵌入到JavaScript程序中间,它是一种数据格式,通常作为整个文件(或HTTP响应)出现。
当需要一个对象时,可以从对象字面量或变量中获取一个对象(或者从函数调用的返回值等)。

4

JSON源自于JavaScript中的对象字面量表示法,本身就是一个字符串。这解释了为什么它看起来很相似。今天,JSON被用作一种通用的序列化各种数据的方式,以便在提交到某个网络或存储之前进行传输。

// this is a JSON variable
var json = '{"foo": "bar", "bar" : "baz"}';

// obj is a JavaScript obj, defined by the object literal on the right hand side
var obj = {foo: 'bar', bar : 'baz'};
  • JSON - 序列化的对象;类似于在 JS 中定义对象的语法
  • 对象字面量 - 在 JS 中定义对象的简写语法
  • Object - 例如通过对象字面量定义而得到的结果

在 JS 中,您可以通过使用以下方法将 JSON 字符串转换为对象:

var obj = JSON.parse( json );

通过

,您可以获取对象的JSON表示(不包括附加函数)。
var json = JSON.stringify( obj );

2
你的 JSON 字符串仍然无效。 - Eric

2
根据规范,在JSON中所有的字符串,无论是值还是关键字,都应该用双引号括起来。
如果你的示例包含以下内容,则是有效的JSON字符串。
{"foo": "bar", "bar": "baz"}

从同一个链接中, “值可以是双引号中的字符串,或数字,或true或false或null,或对象或数组。这些结构可以嵌套。” - Jashwant
如果它是{"foo": "bar", "bar": "baz"},那就是有效的JSON格式...周围的引号是无效的。 - Felix Kling
@FelixKling 我认为他们所说的“有效的JSON字符串”实际上是指“包含有效的JSON语法的字符串”。或者换句话说,一个可以解析为JSON对象的字符串。 - Anthony Grist
1
@Anthony:嗯...也许吧。在这里,“JSON字符串”这个术语相当模糊。“字符串”可能是指数据类型(在JavaScript中)(在这种情况下,引号没问题),或者只是一系列字符(引号不应该出现)(至少这是我作为非英语母语者的理解)。 - Felix Kling
1
@Felix:为了澄清(因为我也不是以英语为母语的人):我指的是一个字符串作为字符串(数据类型)内部的字符序列。 - Marcel Korpel

0

对象字面量:

参考mozilla

对象字面量是一个对象的零个或多个属性名和相关值的列表,用花括号({})括起来。

Javascript 对象:

参考mozilla

在 JavaScript 中,对象是一个独立的实体,具有属性和类型。

JSON:

参考mozillamozilla

JSON(JavaScript Object Notation)是一种数据交换格式。它与JavaScript语法的子集非常相似,尽管它不是一个严格的子集。JSON是一种用于序列化对象、数组、数字、字符串、布尔值和null的语法。它基于JavaScript语法,但与之不同:一些JavaScript不是JSON,一些JSON不是JavaScript。
简单来说,一个“对象”是一个JavaScript变量,它可以具有属性和类型。
“对象字面量”是一种将属性和相关值分配给“对象”的方法。
JSON是一种更严格的“对象字面量”,用于数据交换,它被包装为字符串。(通常,这种严格性是为了让所有语言都能使用它,我们不能将“函数”用作值,“键”应始终用双引号括起来(在对象字面量中不是强制性的))。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接