JSON和XML有什么区别?
Answers:
根本没有其他答案似乎提到的根本区别是,XML是一种标记语言(正如它实际上以其名称所称),而JSON是一种表示对象的方式(也以其名称说明)。
标记语言是一种向自由流动的纯文本中添加额外信息的方法,例如
Here is some text.
使用XML(使用某些元素词汇表),您可以输入:
<Document>
<Paragraph Align="Center">
Here <Bold>is</Bold> some text.
</Paragraph>
</Document>
这就是使标记语言对表示文档如此有用的原因。
JSON之类的对象表示法不那么灵活。但这通常是一件好事。表示对象时,您根本不需要额外的灵活性。为了用JSON表示上述示例,您实际上必须手动解决XML为您解决的一些问题。
{
"Paragraphs": [
{
"align": "center",
"content": [
"Here ", {
"style" : "bold",
"content": [ "is" ]
},
" some text."
]
}
]
}
它不如XML好,原因是我们试图使用对象符号进行标记。因此,我们必须发明一种方法,使用可以容纳字符串和嵌套对象混合的“内容”数组在对象周围散布纯文本片段。
另一方面,如果您具有典型的对象层次结构,并且想要在流中表示它们,那么JSON比HTML更适合此任务。
{
"firstName": "Homer",
"lastName": "Simpson",
"relatives": [ "Grandpa", "Marge", "The Boy", "Lisa", "I think that's all of them" ]
}
这是逻辑上等效的XML:
<Person>
<FirstName>Homer</FirstName>
<LastName>Simpsons</LastName>
<Relatives>
<Relative>Grandpa</Relative>
<Relative>Marge</Relative>
<Relative>The Boy</Relative>
<Relative>Lisa</Relative>
<Relative>I think that's all of them</Relative>
</Relatives>
</Person>
JSON看起来更像是我们用编程语言声明的数据结构。而且,它的名称重复很少。
但最重要的是,它具有一种区分“记录”(无序项目,由名称标识)和“列表”(有序项目,由位置标识)的定义方法。如果没有这种区别,对象标记实际上是没有用的。和XML没有这种区别!在我的XML示例中,<Person>
是一个记录,并且<Relatives>
是一个列表,但是语法没有这样标识它们。
相反,XML具有“元素”与“属性”。这看起来就像是一种区分,但事实并非如此,因为属性只能具有字符串值。它们不能是嵌套对象。因此,我无法将此想法应用于<Person>
,因为我不必<Relatives>
变成单个字符串。
通过使用外部模式或其他用户定义的属性,您可以形式化XML中的列表和记录之间的区别。JSON的优点在于,低级语法在其中内置了这种区别,因此它非常简洁和通用。这意味着JSON默认情况下更“自我描述”,这是两种格式的重要目标。
因此,JSON应该是对象表示法的首选,其中XML的最佳选择是文档标记。
不幸的是,对于XML而言,我们已经将HTML作为世界排名第一的富文本标记语言。试图用XML来重新格式化HTML,但是这样做没有太多优势。
因此,XML(在我看来)应该是一种非常有限的利基技术,如果您由于某种原因不想使用HTML,则最适合仅用于发明自己的富文本标记语言。问题是1998年Web仍然有很多炒作,而XML由于与HTML的表面相似而变得流行。试图将一种实际上为方便标记而设计的语法应用于分层数据,这是一个奇怪的设计选择。
它们都是分层数据的数据格式,因此虽然语法有很大不同,但结构相似。例:
JSON:
{
"persons": [
{
"name": "Ford Prefect",
"gender": "male"
},
{
"name": "Arthur Dent",
"gender": "male"
},
{
"name": "Tricia McMillan",
"gender": "female"
}
]
}
XML:
<persons>
<person>
<name>Ford Prefect</name>
<gender>male</gender>
</person>
<person>
<name>Arthur Dent</name>
<gender>male</gender>
</person>
<person>
<name>Tricia McMillan</name>
<gender>female</gender>
</person>
</persons>
但是,XML格式比示例显示的要先进。例如,您可以向每个元素添加属性,并且可以使用名称空间对元素进行分区。还有用于定义XML文件格式,用于查询XML数据的XPATH语言以及用于将XML转换为表示数据的XSLT的标准。
XML格式已经存在了一段时间,因此已经开发了许多软件。JSON格式很新,因此对它的支持要少得多。
尽管XML是作为独立的数据格式开发的,但JSON是专门为Javascript和AJAX使用而开发的,因此该格式与Javascript文字对象完全相同(即,它是Javascript代码的子集,例如,它可以不包含用于确定值的表达式)。
XML和JSON之间的区别在于XML是一种元语言/标记语言,而JSON是一种轻量级的数据交换。即,XML语法专门设计为没有固有的语义。除非特定的处理应用程序以特定的方式处理它们,否则特定的元素名称将毫无意义。相比之下,JSON语法具有内置的特定语义,{}之间的内容是对象,[]之间的内容是数组,等等。
因此,JSON解析器确切知道每个JSON文档的含义。XML解析器仅知道如何将标记与数据分开。为了处理XML文档的含义,您必须编写其他代码。
为了说明这一点,让我借用Guffa的示例:
{ "persons": [
{
"name": "Ford Prefect",
"gender": "male"
},
{
"name": "Arthur Dent",
"gender": "male"
},
{
"name": "Tricia McMillan",
"gender": "female"
} ] }
他给出的等效XML并不是完全相同的东西,因为JSON示例在语义上是完整的,但需要以特定方式解释XML才能产生相同的效果。实际上,JSON是使用已知语义的已建立标记语言的示例,而XML示例则创建了没有任何预定义语义的全新标记语言。
更好的XML等效项是使用与JSON相同的语义定义一种(虚拟的)XJSON语言,但使用XML语法。它可能看起来像这样:
<xjson>
<object>
<name>persons</name>
<value>
<array>
<object>
<value>Ford Prefect</value>
<gender>male</gender>
</object>
<object>
<value>Arthur Dent</value>
<gender>male</gender>
</object>
<object>
<value>Tricia McMillan</value>
<gender>female</gender>
</object>
</array>
</value>
</object>
</xjson>
编写XJSON处理器后,对于JSON可以代表的所有类型的数据,它可以完全完成JSON处理器的工作,并且可以在JSON和XJSON之间无损地转换数据。
因此,抱怨XML与JSON具有不同的语义是错的。XML语法在设计上是无语义的。关键是要提供一种基础语法,该语法可用于创建具有所需语义的标记语言。这使XML非常适合组成临时数据和文档格式,因为您不必为它们构建解析器,只需为它们编写处理器。
但是XML的缺点是语法冗长。对于您要创建的任何给定的标记语言,您可以想出一种更为简洁的语法来表达特定语言的特定语义。因此,JSON语法比我上面的假设XJSON小得多。
如果遵循这种方法,那么对于真正广泛使用的数据格式而言,创建唯一语法并为该语法编写解析器所需的额外时间将被自定义标记语言的简洁性和直观性所抵消。随之而来的是,使用具有已建立语义的JSON通常比组成许多XML标记语言(然后需要为其实现语义)更有意义。
随之而来的是,可以用XML对某些类型的语言和协议进行原型设计是有意义的,但是,一旦该语言或协议开始普遍使用,就可以考虑创建一种更紧凑和更具表现力的自定义语法。
附带说明一下,有趣的是SGML意识到了这一点,并提供了一种机制来为SGML文档指定减少的标记。因此,您实际上可以为JSON语法编写SGML DTD,从而允许SGML解析器读取JSON文档。XML取消了此功能,这意味着,今天,如果您想为特定标记语言提供更紧凑的语法,则必须像JSON一样将XML留在后面。
它们是信息表示的两种格式。JSON的设计更加紧凑,而XML的设计却更具可读性。
XML使用标签结构来表示项目,例如
<tag>item</tag>
,因此XML文档是彼此嵌套的一组标签。JSON语法看起来像是Javascript语言的构造,包含所有东西,例如列表和字典:
{
'attrib' : 'value',
'array' : [1, 2, 3]
}
因此,如果您使用JSON,那么在许多脚本语言(尤其是Javascript和Python)中使用JSON字符串确实非常简单。