它没有 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:
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 中原型化某些类型的语言和协议是有意义的,但是,一旦这种语言或协议得到普遍使用,就要考虑创建一种更紧凑、更具表现力的自定义语法。