XML 与 JSON 在设计目的和应用场景上的区别


写在前面

今天在看《第一行代码》中关于SharedPreference的部分时,突然觉得用XML保存数据很不方便,比如如果要储存数组,用JSON中一行代码就可以解决的问题,XML还得自己写一些代码,比如:Is it possible to add an array or object to SharedPreferences on Android

所以我很好奇,XML在竞争如此激烈的时代,还在广泛被使用,是因为它是一个无法解决的历史遗留问题,还是因为XML确实有比JSON更优越的地方。

注:以下部分段落节选并翻译自StackOverflow,不代表本人观点。

XML与JSON最本质的区别

来源,我做了一些注解

最根本上来说,XML是一个markup language(标记语言),而JSON是一种用于数据交换(data-interchange)的序列化对象的语言。

根据Wiki的说法,标记语言是:

In computer text processing, a markup language is a system for annotating a document in a way that is syntactically distinguishable from the text, meaning when the document is processed for display, the markup language is not shown, and is only used to format the text.

标记语言除了文本信息,还包括了一些元信息,这些元信息用来标注如何处理文本信息,比如:

<Document>
    <Paragraph Align="Center">                 <!-- Align是元信息 -->
        Here <Bold>is</Bold> some text.
    </Paragraph>
</Document>

假如试图用JSON完完整整的表述上述的信息:

{
    "Paragraphs": [
        {
            "align": "center",
            "content": [
                "Here ", {
                    "style" : "bold",
                    "content": [ "is" ]
                },
                " some text."
            ]
        }
    ]
}

是不是觉得JSON比XML还要复杂的多?

原因在于,JSON里面没有元数据和数据的区别所有的东西都是数据,所以要人为的加上一些多余的字符串(比如content)进行区分。


同样的,XML也不擅长做JSON所擅长做的事,那就是序列化对象:

{
    "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有2点优于XML的地方:

  • 对象的内部结构一目了然,简洁明了。
  • JSON语法规定[]是数组,{}是对象,而XML没有如此的语法规定,我们只能临时发明一种方式来表示数组,然后自己添加代码来识别这个数组。

如果我们人为施加一种策略,那么XML的确可以完成JSON的工作,但是JSON本身内建了这种策略。

比如这里,有人提出了XJSON,可以用XML完成JSON的工作:

<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>

Once you wrote an XJSON processor, it could do exactly what JSON processor does, for all the types of data that JSON can represent, and you could translate data losslessly between JSON and XJSON.
如果你写出一个针对XJSON的解析包,那么它可以完成JSON所有的工作。

不过,这未免也太眼花缭乱了一些。

所以在表示对象这个问题上面,JSON是远比XML优越的一种语言。

写在最后

在我看来,XML和JSON是乍一看有点相似,但设计出发点和应用场景却并不重叠的语言。

就好像以前我发现MATLAB除了可以做矩阵计算,还可以写GUI,但我觉得不会有人真的用它去写复杂的GUI界面。Python这种语言似乎很万能很流行,什么都可以做,甚至游戏,但不会真的有人去用Python去写游戏引擎的底层部分。

延伸阅读:

为什么都反对 XML 而支持使用 JSON?

(END)


文章作者: GeT Left
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GeT Left !
 上一篇
[C++][标准库] 完美转发 = 引用折叠 + 万能引用 + std::forward [C++][标准库] 完美转发 = 引用折叠 + 万能引用 + std::forward
完美转发是一个比较简单,却又比较复杂的东西。本文将会结合GCC源码,详细解读完美转发的动机和原理。
2021-04-29
本篇 
XML 与 JSON 在设计目的和应用场景上的区别 XML 与 JSON 在设计目的和应用场景上的区别
XML和JSON各自有何优点,适合在什么场景中使用?本质上,XML是文本标记语言,JSON是对象序列化语言。
2021-02-21
  目录