json和xml有什么区别
JSON和XML有什么区别?
似乎没有其他答案似乎提到的根本区别是,XML是一种标记语言(正如其名称中所述),而JSON是一种表示对象的方式(同样在其名称中指出)。
标记语言是向自由stream动的纯文本添加额外信息的一种方式,例如
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那么好,原因是我们试图用对象表示法进行标记。 所以我们必须发明一种方法来散布我们的对象周围的纯文本片段,使用“内容”数组,可以容纳string和嵌套对象的混合物。
另一方面,如果您有典型的对象层次结构,并且想要在stream中表示它们,则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看起来更像我们在编程语言中声明的数据结构。 而且它有更less的重复名称。
但最重要的是,它有一个明确的方式来区分“logging”(项目无序,名称标识)和“列表”(项目sorting,确定的位置)。 如果没有这种区分,对象符号实际上是无用的。 而XML没有这样的区别! 在我的XML例子中, <Person>
是一个logging,并且<Relatives>
是一个列表,但是它们不是通过语法标识的。
相反,XML具有“元素”而不是“属性”。 这看起来像是同一种区别,但它不是,因为属性只能有string值。 它们不能是嵌套的对象。 所以我不能把这个想法应用到<Person>
,因为我不应该把<Relatives>
变成一个单独的string。
通过使用外部模式或额外的用户定义的属性,您可以用XML来forms化列表和logging之间的区别。 JSON的优点是低级语法具有内置的区别,所以非常简洁和通用。 这意味着JSON默认更“自我描述”,这是两种格式的重要目标。
所以JSON应该是对象表示法的首选,其中XML的甜点是文档标记。
不幸的是,对于XML来说,我们已经拥有了HTML作为全球头号富文本标记语言。 试图用XML来重新构造HTML,但在这方面没有太多的优势。
所以XML(在我看来)应该是一个相当有限的利基技术,如果你不想使用HTML出于某种原因,最适合于发明自己的富文本标记语言。 问题在于,1998年仍然有很多关于Web的宣传,而XML由于其与HTML的表面相似而变得stream行。 这是一个奇怪的deviseselect,试图将分层数据应用于实际为方便标记而devise的语法。
它们都是分层数据的数据格式,所以虽然语法有很大不同,但结构是相似的。 例:
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格式是相当新的,所以对它的支持很less。
虽然XML是作为一种独立的数据格式开发的,但是JSON是专门为Javascript和AJAX而开发的,所以其格式与Javascript文本对象完全一样(也就是说它是Javascript代码的一个子集,不包含expression式来确定值)。
XML和JSON的根本区别在于XML是一种元语言,JSON是一种标记语言。 也就是说,XML语法是专门devise为没有固有的语义。 在特定的处理应用程序以特定的方式处理它们之前,特定的元素名称并不意味着什么。 相比之下,JSON语法内置了特定的语义:{}之间的东西是一个对象,[]之间的东西是一个数组等等。
因此,JSONparsing器完全知道每个JSON文档的含义。 XMLparsing器只知道如何将标记与数据分开。 要处理XML文档的含义,您必须编写额外的代码。
为了说明这一点,让我借用古法的例子:
{ "persons": [ { "name": "Ford Prefect", "gender": "male" }, { "name": "Arthur Dent", "gender": "male" }, { "name": "Tricia McMillan", "gender": "female" } ] }
他给出的XML等价物并不是一回事,因为虽然JSON示例在语义上是完整的,但是XML需要以特定的方式解释才能产生相同的效果。 实际上,JSON就是一个使用build立的标记语言的例子,其语义已经是已知的,而XML例子创build了一个全新的标记语言,没有任何预定义的语义。
一个更好的XML等价物将是定义一个(虚构的)XJSON语言,其语义与JSON相同,但使用XML语法。 它可能看起来像这样:
<xjson> <object> <name>persons</name> <value> <array> <object> <name>name</name> <value>Ford Prefect</value> <name>gender</name> <value>male</value> </object> <object> <name>name</name> <value>Arthur Dent</value> <name>gender</name> <value>male</value> </object> <object> <name>name</name> <value>Tricia McMillan</value> <name>gender</name> <value>female</value> </object> </array> </value> </object> </xjson>
一旦你写了一个XJSON处理器,它可以完成JSON处理器的function,对于JSON可以表示的所有types的数据,你可以在JSON和XJSON之间无损地转换数据。
所以,抱怨说XML没有与JSON相同的语义是错过了重点。 XML语法通过devise无需Sematics。 关键是要提供一个底层的语法,可以用来创build标记语言与任何你想要的语义。 这使得XML非常适合构build特定的数据和文档格式,因为您不必为它们构buildparsing器,只需为它们编写一个处理器即可。
但XML的缺点是语法冗长。 对于任何你想创build的标记语言,你可以想出一个更简洁的语法来expression你的特定语言的特定语义。 因此,JSON语法比我上面假设的XJSON更紧凑。
如果遵循对于真正广泛使用的数据格式的话,为语法创build唯一语法并编写parsing器所需的额外时间被自定义标记语言的更简洁和更直观的语法所抵消。 而且,使用JSON和其已build立的语义,通常更有意义,而不是构成许多需要实现语义的XML标记语言。
因此,在XML中对某些types的语言和协议进行原型化是有意义的,但是一旦语言或协议变得普遍使用,就可以考虑创build一个更紧凑和更具expression性的定制语法。
值得注意的是,SGML认识到这一点,并提供了一种指定SGML文档缩减标记的机制。 因此,您实际上可以为JSON语法编写一个SGML DTD,以允许SGMLparsing器读取JSON文档。 XML删除了这个function,这就意味着,如果你想为特定的标记语言使用更紧凑的语法,就必须像XML一样留下XML。
它们是表示数据的两种不同的方式,但它们是非常不相似的。 JSON和XML的维基百科页面给出了每个例子,还有一个比较段落
它们是信息表示的两种格式。 虽然JSON被devise得更加紧凑,但是XML的devise更具可读性。
XML使用标签结构来呈现项目,如<tag>item</tag>
,所以XML文档是嵌套在一起的一组标签。 而JSON语法看起来像Javascript语言的结构,所有东西都像列表和字典:
{ 'attrib' : 'value', 'array' : [1, 2, 3] }
所以如果你使用JSON,在许多脚本语言中使用JSONstring非常简单,尤其是Javascript和Python。