Dan*_*ker 158
其他答案似乎没有提到的根本区别在于,XML是一种标记语言(实际上就是它的名称),而JSON是一种表示对象的方式(也在其名称中也有说明).
标记语言是一种向自由流动的纯文本添加额外信息的方法,例如
Here is some text.
Run Code Online (Sandbox Code Playgroud)
使用XML(使用特定元素词汇表),您可以:
<Document>
<Paragraph Align="Center">
Here <Bold>is</Bold> some text.
</Paragraph>
</Document>
Run Code Online (Sandbox Code Playgroud)
这使得标记语言对于表示文档非常有用.
像JSON这样的对象符号并不灵活.但这通常是一件好事.当您表示对象时,您根本不需要额外的灵活性.要在JSON中表示上述示例,您实际上必须手动解决XML为您解决的一些问题.
{
"Paragraphs": [
{
"align": "center",
"content": [
"Here ", {
"style" : "bold",
"content": [ "is" ]
},
" some text."
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
它不如XML好,原因是我们试图用对象表示法做标记.因此,我们必须发明一种方法,使用可容纳字符串和嵌套对象混合的"内容"数组,在我们的对象周围散布纯文本片段.
另一方面,如果您具有典型的对象层次结构并且您希望在流中表示它们,则JSON比HTML更适合此任务.
{
"firstName": "Homer",
"lastName": "Simpson",
"relatives": [ "Grandpa", "Marge", "The Boy", "Lisa", "I think that's all of them" ]
}
Run Code Online (Sandbox Code Playgroud)
这是逻辑上等效的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>
Run Code Online (Sandbox Code Playgroud)
JSON看起来更像我们在编程语言中声明的数据结构.它也减少了重复的名称重复.
但最重要的是,它有一种明确的方式来区分"记录"(无名称,由名称标识的项目)和"列表"(按位置标识的订购项目).如果没有这样的区别,对象符号实际上是无用的.而XML没有这样的区别!在我的XML示例中<Person>是一个记录并且<Relatives>是一个列表,但它们不是通过语法识别的.
相反,XML具有"元素"与"属性".这看起来像是同一种区别,但事实并非如此,因为属性只能包含字符串值.它们不能是嵌套对象.所以我无法应用这个想法<Person>,因为我不应该<Relatives>变成单个字符串.
通过使用外部模式或额外的用户定义属性,您可以在XML中形式化列表和记录之间的区别.JSON的优点是低级语法具有内置于其中的区别,因此它非常简洁和通用.这意味着默认情况下JSON更"自我描述",这是两种格式的重要目标.
所以JSON应该是对象表示法的首选,其中XML的最佳位置是文档标记.
不幸的是,对于XML,我们已经将HTML作为世界头号富文本标记语言.尝试用XML重构HTML,但这并没有太大的优势.
所以XML应该(在我看来)是一个非常有限的小众技术,如果你不想出于某种原因想要使用HTML,那么它最适合发明你自己的富文本标记语言.问题在于,1998年仍然有很多关于Web的炒作,并且由于它与HTML的表面相似性而变得流行.尝试将分层数据应用于实际设计用于方便标记的语法是一种奇怪的设计选择.
Guf*_*ffa 27
它们都是分层数据的数据格式,因此虽然语法完全不同,但结构类似.例:
JSON:
{
"persons": [
{
"name": "Ford Prefect",
"gender": "male"
},
{
"name": "Arthur Dent",
"gender": "male"
},
{
"name": "Tricia McMillan",
"gender": "female"
}
]
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
但是,XML格式比示例中显示的更为先进.例如,您可以向每个元素添加属性,并且可以使用命名空间来分区元素.还有用于定义XML文件格式的标准,用于查询XML数据的XPATH语言以及用于将XML转换为表示数据的XSLT.
XML格式已经存在了一段时间,因此有很多软件为它开发.JSON格式是相当新的,因此对它的支持要少得多.
虽然XML是作为独立的数据格式开发的,但JSON是专门为与Javascript和AJAX一起使用而开发的,因此格式与Javascript文字对象完全相同(也就是说,它是Javascript代码的一个子集,例如它可以不包含确定值的表达式.
小智 21
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"
} ] }
Run Code Online (Sandbox Code Playgroud)
他给出的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>
Run Code Online (Sandbox Code Playgroud)
一旦你编写了一个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.