首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >json和xml之间的区别是什么

json和xml之间的区别是什么
EN

Stack Overflow用户
提问于 2010-04-12 14:39:34
回答 6查看 141.7K关注 0票数 77

JSON和XML有什么区别?

EN

回答 6

Stack Overflow用户

发布于 2010-04-12 15:25:23

根本的区别是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没有这样的区别!在我的示例中,<Person>是一条记录,<Relatives>是一个列表,但是它们并不是通过语法来标识的。

相反,XML具有“元素”和“属性”。这看起来是相同的区别,但事实并非如此,因为属性只能有字符串值。它们不能是嵌套对象。所以我不可能将这个想法应用于<Person>,因为我不应该将<Relatives>转换为单个字符串。

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

因此,JSON应该是对象表示法的首选,而XML的最佳位置是文档标记。

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

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

票数 165
EN

Stack Overflow用户

发布于 2010-04-12 15:00:18

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

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代码的子集,例如,它不能包含用于确定值的表达式)。

票数 27
EN

Stack Overflow用户

发布于 2011-11-04 00:43:59

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

它还表明,在XML中构建特定类型的语言和协议的原型是有意义的,但是,一旦语言或协议得到普遍使用,就需要考虑创建更紧凑和更具表现力的自定义语法。

有趣的是,作为附注,SGML认识到了这一点,并提供了一种为SGML文档指定简化标记的机制。因此,您实际上可以为JSON语法编写SGML DTD,从而允许SGML解析器读取JSON文档。XML删除了这一功能,这意味着,如果您想为特定的标记语言提供更紧凑的语法,就必须抛弃XML,就像JSON所做的那样。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2620270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档