Json 和 xml 之间的区别是什么

JSON 和 XML 之间的区别是什么?

142967 次浏览

它们是表示数据的两种不同方式,但它们非常不同。JSONXML的维基百科页面分别给出了一些示例,其中有一个 比较段落

它们是信息的两种表示形式。JSON 被设计得更紧凑,而 XML 被设计得更具可读性。

XML 使用标记结构来显示项,如 <tag>item</tag>, 因此,XML 文档是一组相互嵌套的标记。 JSON 语法看起来像是从 Javascript 语言构建出来的,包含了所有类似列表和字典的东西:

{
'attrib' : 'value',
'array' : [1, 2, 3]
}

因此,如果使用 JSON,在许多脚本语言中使用 JSON 字符串非常简单,特别是在 Javascript 和 Python 中。

它们都是分层数据的数据格式,因此虽然语法不同,但结构相似。例如:

杰森:

{
"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 是一种表示对象的方式(名称中也有提到)。

标记语言是一种向自由流动的纯文本添加额外信息的方法,例如

Here is some text.

使用 XML (使用某种元素词汇表) ,您可以放置:

<Document>
<Paragraph Align="Center">
Here <Bold>is</Bold> some text.
</Paragraph>
</Document>

This is what makes markup languages so useful for representing documents.

像 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" ]
}

Here's the logically equivalent 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 looks more like the data structures we declare in programming languages. Also it has less redundant repetition of names.

但最重要的是,它有一个明确的方法来区分“记录”(项目无序,由名称标识)和“列表”(项目有序,由位置标识)。如果没有这样的区别,对象符号实际上是无用的。XML 没有这样的区别!在我的 XML 示例中,<Person>是一条记录,<Relatives>是一个列表,但是它们并没有通过语法来标识。

Instead, XML has "elements" versus "attributes". This looks like the same kind of distinction, but it's not, because attributes can only have string values. They cannot be nested objects. So I couldn't have applied this idea to <Person>, because I shouldn't have to turn <Relatives> into a single string.

通过使用外部模式或额外的用户定义属性,可以在 XML 中形式化列表和记录之间的区别。JSON 的优点是底层语法内置了这种区别,因此它非常简洁和通用。这意味着默认情况下 JSON 更“自我描述”,这是两种格式的重要目标。

因此 JSON 应该是对象表示法的第一选择,其中 XML 的甜点是文档标记。

不幸的是,对于 XML 来说,HTML 已经是世界上最好的富文本标记语言。我们尝试用 XML 重新表达 HTML,但这样做没有多大好处。

因此,XML (在我看来)应该是一种相当有限的利基技术,如果出于某种原因不想使用 HTML,那么只有在创建自己的富文本标记语言时才最合适。问题在于,1998年仍然有很多关于 Web 的炒作,而 XML 之所以流行,是因为它在表面上与 HTML 相似。尝试将实际上为方便标记而设计的语法应用于分层数据是一种奇怪的设计选择。

XML 和 JSON 的区别在于 XML 是一种元语言/标记语言,而 JSON 是一种轻量级的数据交换。也就是说,XML 语法是专门设计的,没有固有的语义。特定的元素名称没有任何意义,直到特定的处理应用程序以特定的方式处理它们。相比之下,JSON 语法具有特定的内置语义,比如{}是一个对象,[]是一个数组,等等。

因此,JSON 解析器确切地知道每个 JSON 文档的含义。XML 解析器只知道如何将标记与数据分离。要处理 XML 文档的含义,必须编写额外的代码。

To illustrate the point, let me borrow Guffa's example:

{   "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 之间无损地转换数据。

So, to complain that XML does not have the same semantics as JSON is to miss the point. XML syntax is semantics-free by design. The point is to provide an underlying syntax that can be used to create markup languages with any semantics you want. This makes XML great for making up ad-hoc data and document formats, because you don't have to build parsers for them, you just have to write a processor for them.

但 XML 的缺点是语法冗长。对于您想要创建的任何给定的标记语言,您都可以提供一种更简洁的语法来表达特定语言的特定语义。因此,JSON 语法比我上面假设的 XJSON 要紧凑得多。

如果对于真正广泛使用的数据格式来说,创建惟一语法并为该语法编写解析器所需的额外时间被自定义标记语言更简洁和更直观的语法所抵消。另外,使用带有已建立语义的 JSON 通常比组成许多 XML 标记语言更有意义,因为您需要为这些标记语言实现语义。

接下来还要说明的是,在 XML 中原型化某些类型的语言和协议是有意义的,但是,一旦这种语言或协议得到普遍使用,就要考虑创建一种更紧凑、更具表现力的自定义语法。

值得注意的是,SGML 认识到了这一点,并提供了一种为 SGML 文档指定简化标记的机制。因此,实际上可以为 JSON 语法编写一个 SGML DTD,允许 SGML 解析器读取 JSON 文档。XML 消除了这种能力,这意味着,如今,如果您希望为特定的标记语言提供更紧凑的语法,就必须像 JSON 那样抛弃 XML。