JSON和XML有什么区别?
答案 0 :(得分:153)
其他答案似乎没有提到的根本区别在于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的炒作,并且由于它与HTML的表面相似性而变得流行。尝试将分层数据应用于实际设计用于方便标记的语法是一种奇怪的设计选择。
答案 1 :(得分:27)
它们都是分层数据的数据格式,因此虽然语法完全不同,但结构类似。例如:
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代码的一个子集,因为它例如,不能包含用于确定值的表达式。)
答案 2 :(得分:19)
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等价物是定义一个(虚构的)XJSON语言,其语义与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标记语言,然后您需要实现语义。
此外,在XML中对某些类型的语言和协议进行原型化是有意义的,但是,一旦语言或协议得到普遍使用,就要考虑创建一个更紧凑和富有表现力的自定义语法。
有趣的是,作为旁注,SGML认识到了这一点并提供了一种为SGML文档指定缩减标记的机制。因此,您实际上可以为JSON语法编写SGML DTD,以允许SGML解析器读取JSON文档。 XML删除了这个功能,这意味着,今天,如果你想要一个特定标记语言的更紧凑的语法,你必须像JSON一样留下XML。
答案 3 :(得分:4)
它们是表示数据的两种不同方式,但它们非常不同。 JSON和XML的维基百科页面提供了每个的一些示例,并且有一个comparison段落
答案 4 :(得分:3)
它们是信息表示的两种格式。虽然JSON设计得更紧凑,但XML的设计更具可读性。
答案 5 :(得分:2)
XML使用标记结构来表示项目,例如
<tag>item</tag>
,
所以XML文档是一组彼此嵌套的标记。
JSON语法看起来像是一种来自Javascript语言的构造,包含列表和词典之类的所有内容:
{
'attrib' : 'value',
'array' : [1, 2, 3]
}
因此,如果您使用JSON,在许多脚本语言中使用JSON字符串非常简单,尤其是Javascript和Python。