JSON和XML有什么区别?

78

JSON和XML有什么区别?


1
http://en.wikipedia.org/wiki/Json#XML - Axarydax
1
可能是重复的问题 https://dev59.com/DkbRa4cB1Zd3GeqPykSD - ACP
2
@Pandiya:那个问题比这个更加专业化,我不认为它是重复问题。 - Charles Stewart
@pia,请问您能详细说明一下您的问题吗?我认为这是一个很好的问题,但格式不够优化,而且非常简短 - 还不足以获得+1。 - mafu
主要的区别在于人们可以无休止地争论如何“正确”使用XML。但是JSON没有这样的假设。之后就像可口可乐和百事可乐一样,好像有什么区别。我这么说! - david van brink
给管理员:如果像这样简单且有效的问题不适合问答格式,那么也许是时候修改格式了。 - anotherDev
6个回答

173

没有其他答案提到的基本区别在于,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那样好用,原因是我们试图使用对象表示法来进行标记。因此,我们必须发明一种方法来散布纯文本片段到我们的对象周围,使用“content”数组,其中可以包含字符串和嵌套对象的混合。

另一方面,如果您有典型的对象层次结构,并且想要在流中表示它们,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作为世界上排名第一的Rich Text标记语言了。曾经试图用XML重新定义HTML,但它并没有太多优势。

因此,在我看来,XML应该只是一个相当有限的技术领域,最适合仅在某些情况下不想使用HTML发明自己的Rich Text标记语言。问题在于,1998年,由于与HTML的表面相似性,还存在着很多关于Web的炒作,因此XML变得流行起来。将层次数据应用于实际上是为便捷标记而设计的语法是一个奇怪的设计选择。


10
两个踩,没有评论!人生如此。 - Daniel Earwicker
1
@Pranav - 我写的时候是假设Homer自己输入了数据... - Daniel Earwicker
2
@Tomer Gable - 你可能错过了“通过使用外部模式...”这一部分。而且,与数据建模相比,XSLT甚至更不适合用作XML的应用程序。事实上,他们通过在属性字符串中发明了重要的新语法来欺骗人们,因此它并不是真正基于XML的。说JSON需要额外的组件是一个奇怪的观点:你归功于XML的所有东西也都是额外的组件。 - Daniel Earwicker
6
这显然是一个非常有建设性的回答(和问题),不应该被关闭。再次为版主投下反对票-1。 - rcd
5
再次强调并解释XML实际上是一种标记语言而不是数据格式非常有帮助。谢谢你写这个! - jmrah
显示剩余9条评论

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文件格式的标准,XPATH语言可用于查询XML数据,而XSLT可用于将XML转换为演示数据。
由于XML格式已经存在一段时间,因此已经开发出了许多支持它的软件。JSON格式相对较新,因此对它的支持要少得多。
虽然XML是作为一种独立的数据格式开发的,但JSON是专门为JavaScript和AJAX开发的,因此该格式与JavaScript字面对象完全相同(也就是说,它是JavaScript代码的子集,例如它不能包含表达式来确定值)。

2
“格式与JavaScript字面对象完全相同。” - 不完全相同,JSON文本是JS对象字面量的子集。 - Daniel Earwicker
@Daniel:当然它是一个子集,你自然不能像在Javascript中一样编写任何东西,例如调用函数来获取成员的值。这就是你为什么对答案投反对票的原因吗? - Guffa
1
啊...我本来想给你点赞的,现在 Stack Overflow 不让我修改了,除非你进行一次编辑。把“完全与a相同”改成“a格式的子集”,我会尽快修正。 - Daniel Earwicker

23

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标记语言更有意义,因为您需要实现它们的语义。

还有一件有趣的事情是,SGML认识到了这一点,并提供了指定SGML文档的减少标记的机制。因此,您实际上可以为JSON语法编写一个SGML DTD,使SGML解析器能够读取JSON文档。XML删除了此功能,这意味着如果您想要特定标记语言的更紧凑语法,则必须离开XML,就像JSON所做的那样。


XML能处理XJSON对象节点下名称/值对序列的歧义吗?我认为需要有某种指示哪个名称与哪个值相对应,可以通过添加另一级别(“属性”或“属性”等)或通过在每个名称和值之间添加共享属性来实现。 - user2467065
其他答案称XML是一种标记语言,JSON是一种表示格式。现在你说JSON是标记语言,而XML实际上是一种“元”语言,不管那意味着什么。你能否请澄清一下?如果有人在面试中问我这个问题,我该怎么回答? - anotherDev

4

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


3

它们是表示信息的两种格式。虽然JSON旨在更加紧凑,但XML旨在更易读。


3
显然这是两种不同的表现形式。但我认为XML并不被认为比JSON更易读。JSON通常更加紧凑,但我不认为这是一个重要的设计标准;相反,易读性、简洁性和易用性(特别是从javascript方面)更为重要。更重要的是,它们实际上具有非常不同的逻辑结构:XML是嵌入式标记格式,具有分层模型;而JSON是对象表示法,具有对象/帧/图模型(尽管“图”可能过于夸张,因为它没有对象身份的概念)。 - StaxMan
也许有点晚了,但我想知道为什么上面的回答会被踩。 (我应该说是个人意见而不是答案)。@StaxMan所说的也是个人意见(甚至可以通过“我不认为那是一个重要的设计标准”这样的话来证明)。 - Stunner
原始答案没有提供任何支持“JSON设计更紧凑,XML更易读”的任何理由,如果我要将其标记为不好的答案(我还没有这样做);并且它也没有提到更基本的区别。 - StaxMan

2

XML使用标签结构来呈现项,例如 <tag>item</tag>, 因此,XML文档是一组嵌套在彼此中的标签。 而JSON语法看起来像Javascript语言的结构,拥有列表和字典等所有内容:

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

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


1
在高层次上是的,但是你的例子不是有效的JSON:字段名必须用双引号括起来。字符串值也是如此。 - StaxMan
1
抱歉,已经修复了 :) - Enchantner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接