json和xml有什么区别[关闭]


75

JSON和XML有什么区别?




2
@Pandiya:这个问题比这个要专业得多。我不认为这是一个重复。
查尔斯·斯图尔特

@pia,能否请您详细说明您的问题?我认为这是一个很好的问题,但是格式不是最佳选择,而且格式很短-尚不足以用于+1。
mafu

主要区别在于人们可以无休止地争论使用XML的“正确”方式。但是JSON没有这样的借口。之后,就像可乐与百事可乐一样,就好像有所不同。见我!
大卫范布林克

Answers:


163

根本没有其他答案似乎提到的根本区别是,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好,原因是我们试图使用对象符号进行标记。因此,我们必须发明一种方法,使用可以容纳字符串和嵌套对象混合的“内容”数组在对象周围散布纯文本片段。

另一方面,如果您具有典型的对象层次结构,并且想要在流中表示它们,那么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作为世界排名第一的富文本标记语言。试图用XML来重新格式化HTML,但是这样做没有太多优势。

因此,XML(在我看来)应该是一种非常有限的利基技术,如果您由于某种原因不想使用HTML,则最适合仅用于发明自己的富文本标记语言。问题是1998年Web仍然有很多炒作,而XML由于与HTML的表面相似而变得流行。试图将一种实际上为方便标记而设计的语法应用于分层数据,这是一个奇怪的设计选择。


8
两票,无可奉告!这就是生活。
Daniel Earwicker 2010年

1
@Daniel:什么投票?我没看到。如果您是为了同情而钓鱼,那么至少应该有一个理由……
Guffa

2
@Tomer Gable-您肯定已经错过了“通过使用外部模式...”这一部分,并且XSLT作为XML应用程序的意义甚至不如数据建模。实际上,他们通过发明适用于属性字符串的重要新语法而作弊,因此它并不是真正基于XML的。说JSON需要额外的组件是一个奇怪的观点:您对XML的信任也都是额外的组件。
Daniel Earwicker 2011年

4
显然,这是一个非常有建设性的答案(和问题),不应关闭。再次将mod降级为-1。
RCD 2014年

4
重新重申并解释XML实际上是一种标记语言,而不是数据格式非常有帮助。感谢您撰写本文!
jrahhali

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文件格式,用于查询XML数据的XPATH语言以及用于将XML转换为表示数据的XSLT的标准。

XML格式已经存在了一段时间,因此已经开发了许多软件。JSON格式很新,因此对它的支持要少得多。

尽管XML是作为独立的数据格式开发的,但JSON是专门为Javascript和AJAX使用而开发的,因此该格式与Javascript文字对象完全相同(即,它是Javascript代码的子集,例如,它可以不包含用于确定值的表达式)。


2
“格式与Javascript文字对象完全相同。” -不完全是,JSON文本是JS对象文字的子集。
Daniel Earwicker 2010年

@Daniel:当然,它是一个子集,您自然不能编写任何您可以用Javascript编写的内容,例如调用一个函数以获取成员的值。那就是为什么你对答案不满意?
Guffa

1
嗯...我实际上是打算投票给你,现在除非你进行编辑,否则我不会让我修复的。选中“与a完全相同”到“ a格式的子集”,我将尽快修复它。
Daniel Earwicker 2010年

22

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等效项是使用与JSON相同的语义定义一种(虚拟的)XJSON语言,但使用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标记语言(然后需要为其实现语义)更有意义。

随之而来的是,可以用XML对某些类型的语言和协议进行原型设计是有意义的,但是,一旦该语言或协议开始普遍使用,就可以考虑创建一种更紧凑和更具表现力的自定义语法。

附带说明一下,有趣的是SGML意识到了这一点,并提供了一种机制来为SGML文档指定减少的标记。因此,您实际上可以为JSON语法编写SGML DTD,从而允许SGML解析器读取JSON文档。XML取消了此功能,这意味着,今天,如果您想为特定标记语言提供更紧凑的语法,则必须像JSON一样将XML留在后面。


XML是否可以处理XJSON中对象节点下的名称/值对序列的歧义?我认为需要通过添加另一个级别(“属性”或“属性”等)或通过在每个名称和值之间添加共享属性来对哪种名称与哪种值进行某种指示?

其他答案将XML称为标记语言,将JSON称为演示文稿格式。现在,您说JSON是标记语言,而XML实际上是一种“元”语言,无论其含义如何。能否请您澄清一下?如果有人在面试中问我该怎么办?
Harsha_K,


3

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


3
是的,显然有两种不同的表示形式。但是我不认为XML在这两者之间更具可读性。JSON通常更紧凑,但是我认为这不是一个重要的设计标准。而是可读性,简单性和易用性(特别是来自javascript)。更重要的是,两个实际上具有完全不同的逻辑结构:XML是具有层次模型的内联标记格式;JSON是具有对象/框架/图形模型的对象表示法(尽管“图形”由于没有对象标识的概念而被高估了)。
StaxMan 2010年

也许这是一个迟到的答复,但是我不知道为什么上面的答案被否决了。(我应该说意见而不是答案)。什么@StaxMan说也是个人意见(甚至可以用语言来证明,如“我不认为这是一个重要的设计标准)..
万人迷

原始答案没有说明任何内容来支持“ JSON设计得更紧凑,XML更易读”的说法,这就是我要对其进行DV验证的原因(我没有)。它没有提到更根本的区别。
StaxMan 2013年

2

XML使用标签结构来表示项目,例如 <tag>item</tag>,因此XML文档是彼此嵌套的一组标签。JSON语法看起来像是Javascript语言的构造,包含所有东西,例如列表和字典:

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

因此,如果您使用JSON,那么在许多脚本语言(尤其是Javascript和Python)中使用JSON字符串确实非常简单。


1
在较高的级别上,但是您的示例不是有效的JSON:字段名称必须用双引号引起来。字符串值相同。
StaxMan 2010年

1
糟糕,现已修复:)
Enchantner 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.