JSON和XML有什么区别?
JSON和XML有什么区别?
没有其他答案提到的基本区别在于,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那样好用,原因是我们试图使用对象表示法来进行标记。因此,我们必须发明一种方法来散布纯文本片段到我们的对象周围,使用“content”数组,其中可以包含字符串和嵌套对象的混合。
另一方面,如果您有典型的对象层次结构,并且想要在流中表示它们,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作为世界上排名第一的Rich Text标记语言了。曾经试图用XML重新定义HTML,但它并没有太多优势。
因此,在我看来,XML应该只是一个相当有限的技术领域,最适合仅在某些情况下不想使用HTML发明自己的Rich Text标记语言。问题在于,1998年,由于与HTML的表面相似性,还存在着很多关于Web的炒作,因此XML变得流行起来。将层次数据应用于实际上是为便捷标记而设计的语法是一个奇怪的设计选择。
它们都是用于层次化数据的数据格式,因此虽然语法相当不同,但结构类似。例如:
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文件格式的标准,XPATH语言可用于查询XML数据,而XSLT可用于将XML转换为演示数据。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示例创建了一个全新的标记语言,没有任何预定义的语义。<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标记语言更有意义,因为您需要实现它们的语义。
还有一件有趣的事情是,SGML认识到了这一点,并提供了指定SGML文档的减少标记的机制。因此,您实际上可以为JSON语法编写一个SGML DTD,使SGML解析器能够读取JSON文档。XML删除了此功能,这意味着如果您想要特定标记语言的更紧凑语法,则必须离开XML,就像JSON所做的那样。
它们是表示信息的两种格式。虽然JSON旨在更加紧凑,但XML旨在更易读。
XML使用标签结构来呈现项,例如
<tag>item</tag>
,
因此,XML文档是一组嵌套在彼此中的标签。
而JSON语法看起来像Javascript语言的结构,拥有列表和字典等所有内容:
{
'attrib' : 'value',
'array' : [1, 2, 3]
}
如果您使用JSON,那么在许多脚本语言中使用JSON字符串非常简单,特别是Javascript和Python。