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

XML XML 131 人阅读 | 20 人回复 | 2021-01-07

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

使用道具 举报

回答|共 20 个

万胜

发表于 2021-1-7 13:35:50 | 显示全部楼层

我只提一个使用上的因素:JSON的结构更容易映射至一般语言的数据结构。

XML和JSON的主要组成成分:
    XML是element、attribute和element content。
    JSON是object、array、string、number、boolean(true/false)和null。
XML要表示一个object (指name-value pair的集合),最初可能会使用element作为object,每个key-value pair 用 attribute 表示:
<student name="John" age="10"/>

但如个某个 value 也是 object,那么就不可以当作attribute:
<student name="John" age="10">
    <address>
        <country>China</country>
        <province>Guang Dong</province>
        <city>...</city>
        <district>...</district>
        ...
    </address>
</student>那么,什么时候用element,什么时候用attribute,就已经是一个问题了。[1] 提到一些优缺点。

而JSON因为有object这种类型,可以自然地映射,不需考虑上述的问题,自然地得到以下的格式。
{
    "name": "John",
    "age" : 10,
    "address" : {
        "country" : "China",
        "province" : "Guang Dong",
        "city" : "..",
        "district" : "..",
        ...
    }
}
除此以外,
    XML需要选择怎么处理element content的换行,而JSON string则不须作这个选择。
    XML只有文字,没有预设的数字格式,而JSON则有明确的number格式,这样在locale上也安全。XML映射数组没大问题,就是数组元素tag比较重复冗余。JSON 比较易读。JSON的true/false/null也能容易统一至一般编程语言的对应语义。

最后,大家可关注我的C++开源JSON项目 miloyip/rapidjson · GitHub 。

[1] ASC X12 REFERENCE MODEL FOR XML DESIGN §7.2.5 http://www.x12.org/x12org/comments/X12Reference_Model_For_XML_Design.pdf
回复

使用道具 举报

快乐人L

发表于 2021-1-7 13:36:14 | 显示全部楼层

我觉得答案中已经有非常多的例子说明 JSON 比 XML 具有优势的地方. 我来说一个使用场景是我觉得 XML 比 JSON 有优势的情况 --- UI 数据的描述.

我们都知道 JSON 和 XML 设计的初衷里都包含一点是对人类友好, 所以两者在这方面属于竞争关系. 而在 UI 描述上, 我觉得 XML 是比 JSON 要优异很多. 我们先来看一组简单的数据排版:

<ui:group layout="vertial">
  <ui:block width="200" layout="horizontal">
    <ui:input value="Search"></ui:input>
    <ui:button>Search</ui:button>
  </ui:block>
  <ui:block width="400"></ui:block>
</ui:group>
倘若由 JSON 描述, 将会变成:

{
  "type": "ui:group",
  "layout": "vertical",
  "children": [
    {
      "type": "ui:block",
      "width": 200,
      "layout": "horizontal",
      "children": [
        { "type": "ui:input", "value": "search" },
        { "type": "ui:button", "label": "Search" },
      ]
    },
    {
      "type": "ui:block",
      "width": 400,
    },
  ],
}
可以看出来, XML 的数据会比 JSON 更符合人类对 UI 布局的描述, JSON 在这个场景中会更加偏向对机器友好.

然而情况还不仅仅是这样, 我们回过头来看看上面数据中的 ui:button 定义. XML 中的定义, 我采用了 `<ui:button>Label</ui:button>` 的形式, 而在 JSON 中, 我刻意的使用了一个 `label` 字段来简化 button 数据在 JSON 中的复杂度. 但是这样做减弱了 ui:button 内部嵌套元素的可能性. 倘若我们需要的是一个 icon button, 在 XML 中, 我们可以这么书写:

<ui:button>
  <icon src="foobar.png"></icon>
  OK
</ui:button>
而在 JSON 中, 嵌套结构将会带来无尽的 Array + Object 的组合, 对人类阅读并不十分友好.

所以, 并不是所有情况都要反对 XML 而去使用 JSON, 我觉得只有在数据需要和代码实例做映射时, JSON 相对 XML 的优势才能体现. 而其他一些使用场景, XML 也好, JSON 也好, 都有各自发挥的地方.
回复

使用道具 举报

快乐人L

发表于 2021-1-7 13:37:10 | 显示全部楼层

在我长时间使用XML和JSON的过程中我发现,其实他们是不可互相替代的。我们只能说如今大部分适合XML的程序要么都写完了要么都不时髦了,现在需要JSON的还没写的程序多一点。
回复

使用道具 举报

快乐人L

发表于 2021-1-7 13:37:49 | 显示全部楼层

XML相比JSON最大的区别是充满了冗余信息。多数时候我们不需要冗余信息,但是一旦需要的时候没有就是不行。这就是XML与JSON最大的区别。
为什么很多人反对使用XML,因为多数时候不需要冗余信息。
回复

使用道具 举报

快乐人L

发表于 2021-1-7 13:38:07 | 显示全部楼层

json的存在是典型的20%功能解决80%需求。
为什么不要xml?因为里面80%的功能你不需要,等你需要的时候你就明白,这事只能xml干,json不行。
回复

使用道具 举报

万胜

发表于 2021-1-7 13:38:39 | 显示全部楼层

原来必须大炮打蚊子的地方,人们发现苍蝇拍更顺手了而已。就像 Python 代替 C++ 和 Java 做了不少网络服务器一样道理。不是每个代码都为了流芳百年,DTD / XSD 还没写好的时候我 JSON API 已经调试完成了。

给一个最简单的例子吧。
In [1]: from json import dumps

In [2]: d = {'name': "vczh", 'rate': "UINT_MAX", 'comments': ['vczh is the god', 'php is the god too']}

In [3]: print(dumps(d, indent=4))
{
    "rate": "UINT_MAX",
    "name": "vczh",
    "comments": [
        "vczh is the god",
        "php is the god too"
    ]
}

用内置类型做建模,无缝转化成 JSON 格式,看起来甚至都不陌生(上例中甚至语法上完全兼容),传统重型工具(如 XML,如 Java / C++)是做不到的。
用 Python 内置 dict / string 类型与 C++ 的 std::string, std::hash_map 进行类比,JSON 在表达 半结构化数据的时候,因为内置几种基本类型,虽然存在灵活性 受到限制的可能性(也仅仅是可能性而已),但方便程度要大大提高。更多的论述请参考  @Milo Yip 前辈的答案 发布于 11:18。

@vczh 在评论中提到,XML 可以非常方便的映射到 C# 类型中去; @沈万马 也提到 XML 包含各种冗余信息。其实这两点之间是相互促进的。
JSON 的设计基于几种非常简单的基础类型(http://json.org 首页 5 张图就概括完了整个语法),其实更适用于基于字典的动态类型甚至 prototype-based 语言;这与 JSON 源自于 JavaScript 也是分不开的。

这种和动态语言内置类型无缝转化的能力,搭配各种优秀的 REPL(Clojure REPL, iPython Notebook, etc。前面的代码就是 iPython 交互过程),真正体现了所谓「探索性编程」(exploratory programming)的强大能力。关于探索性编程的更多探讨请参考 Paul Graham 的 "Hackers & Painter" 选段,具体位置想不起我就不引述了。

p.s. 在有了已成 RFC 6901 [1] 的 JSON Pointer 和有大量实现的 JSON-schema [2] 之后,用 XML 的理由更少了。
[1] RFC 6901 - JavaScript Object Notation (JSON) Pointer
[2] JSON Schema Software

更多知名的 JSON 生态环境重量级工具:
XML 一心想做而没做到的文档数据库:
MongoDB
Apache CouchDB
直接 in-JSON-for-JSON 的搜索引擎:
Open Source Distributed Real Time Search & Analytics

更多不知名的工具选择:
jq - like sed for JSON
XSLT equivalent for JSON: XSLT equivalent for JSONjoelvh/json2json · GitHub

==== 下面是口号时间 ====

Ad-hocy is the new sexy.
PHP 是最好的语言!
回复

使用道具 举报

万胜

发表于 2021-1-7 13:39:19 | 显示全部楼层

【JSON是什么】


为什么都反对 XML 而支持使用 JSON?-1.jpg

JSON是什么,如何处理转义?



1.背景介绍



什么是JSON

JSON (JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。——百度百科
数据传输是我们在敲代码时,经常遇到的一个场景,前后端交互。给数据一个统一的格式有利于我们编写和解析数据。
json,是一种数据格式,在与后端的数据交互中有较为广泛的应用。
JSON的诞生
JSON是 (JavaScript Object Notation, JS 对象标记),它是一种数据交换格式。在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本格式,所以它适合在网络上交换数据。XML本身不算复杂,但是,加上DTD、XSD、XPath、XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范。
终于,在2002年的一天,道格拉斯·克罗克福特(DouglasCrockford)同学为了拯救深陷水深火热同时又被某几个巨型软件企业长期愚弄的软件工程师,发明了JSON这种超轻量级的数据交换格式。
由于JSON非常简单,很快就风靡Web世界,并且成为ECMA标准。几乎所有编程语言都有解析JSON的库,而在JavaScript中,我们可以直接使用JSON,因为JavaScript内置了JSON的解析。把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。
转义
我们在调用 jsonp 接口或者调用js文件的时候,由于文件编码不同会导致出现乱码的问题。 如果你的文件出现了非英文字符,如果调用时文件编码不一致,同样会出现乱码情况。
这也就是为什么要数据统一格式的原因。
JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 JavaScript 对象和字符串值之间得以快速转换 JSON是一种传递对象的语法
JSON是一个提供了stringify和parse方法的内置对象
stringify将js对象转化为符合json标准的字符串
parse将符合json标准的字符串转化为js对象


2.知识剖析



JSON语法
数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组
JSON值
数字(整数/浮点数)
字符串(双引号)
布尔值(true/false)
数组(中括号中)
对象(大括号中)
null
实例
JSON 数据的书写格式是:名称/值对。
名称/值对组合中的名称写在前面(在双引号中),值对写在后面,中间用冒号隔开,
其中 值 可以是:数字(整数或浮点数)、字符串(在双引号中)、布尔值(true或false)、数组(在方括号中)、对象(在花括号中)、null
varjson= {"password":123456,"name":"myname","Booleans":true,"Array":[x,y,z],"object":{}}
或者是嵌套使用


为什么都反对 XML 而支持使用 JSON?-2.jpg

转义概述
为什么需要转义?在js中我们使用的js对象进行处理,但是在与后端数据交换的时候,我们发送规定的json格式的字符串,所以在给后端发送或接受数据的时候,需要转义
{name:"myname",password:123456}
"{"name":"myname","password":123456}"
其中json字符串转js对象,调用parse方法:
js对象 = JSON.parse(json字符串);
js对象转json字符串,调用stringify方法:
json字符串 = JSON.stringify(js对象);

3.常见问题


在json字符串转换成对象,还有eval_r('('+json字符串+')')这个方法,但是在对目标数据进行读取时,可能会出现一些意外的错误:


为什么都反对 XML 而支持使用 JSON?-3.jpg



4.解决方案



原因:eval_r获取的json对象的值中,如果有执行代码,也将照样执行!所以若不能保证数据的安全性,不要使用eval_r方法进行转义。



5.编码实战



下面是一个简单的json数据发送应用,有兴趣可以阅读一下:


为什么都反对 XML 而支持使用 JSON?-4.jpg


6.扩展思考



我们常看到
{name:"myname",password:123456}

{"name":"myname","password":123456}
这样两种格式,即js对象和json,然而js对象和json有什么不一样的地方?
很多人搞不清楚 JSON 和 Js 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串


为什么都反对 XML 而支持使用 JSON?-5.jpg






【更多内容,可以加入IT交流群565763832与大家一起讨论交流】
【这里是技能树·IT修真院:IT修真院官网,初学者转行到互联网的聚集地
回复

使用道具 举报

简单350

发表于 2021-1-7 13:40:14 | 显示全部楼层

你们这些不用 S-EXP 的都是异端!
回复

使用道具 举报

快乐人L

发表于 2021-1-7 13:40:43 | 显示全部楼层

Xml对应树结构,json对应哈希表,一般问题没有那么复杂,需要使用树来表达。但是word文档,ui,政府组织架构这些就只适应树了,这个就是个简单的数据结构的知识。图是最复杂的数据结构,树是最复杂的可表达结构。没事搞那么复杂没意义啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号