一个使用上的因素: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

******************************************************************************************************************************************************

原来必须大炮打蚊子的地方,人们发现苍蝇拍更顺手了而已。就像 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 的设计基于几种非常简单的基础类型(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

refrences:

http://www.zhihu.com/question/25636060

为什么都反对XML而支持使用json呢?的更多相关文章

  1. 使Asp.net Core同时支持输出Json/Xml

    我们知道Asp.net Core是支持输出为Json格式的.同时也支持输出为xml格式.只要我们正确的配置.并在Request时指定正确的Accept,即可根据不同的Header来输出不同的格式. 前 ...

  2. 为什么针对XML的支持不够好?如何改进?

    为什么针对XML的支持不够好?如何改进? 物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurati ...

  3. Java中将xml文件转化为json的两种方式

    原文地址https://blog.csdn.net/a532672728/article/details/76312475 最近有个需求,要将xml转json之后存储在redis中,找来找去发现整体来 ...

  4. 09: xmltodict 模块将xml格式转成json格式

    1.1 : xmltodict 模块将xml格式转成json格式 <?xml version="1.0"?> <!--#版本号--> <data> ...

  5. 【mysql】mysql5.7支持的json字段查询【mybatis】

    mysql5.7支持的json字段查询 参考:https://www.cnblogs.com/ooo0/p/9309277.html 参考:https://www.cnblogs.com/pfdltu ...

  6. iis配置js支持读取json文件配置

    默认情况下,iis不支持解析.json文件,这就需要我们自己在iis下配置方法一:iis配置1.点击开始菜单选择控制面板: 2.控制面板内点击管理工具,选择Internet信息服务(IIS)管理器. ...

  7. IIS支持解析json

      IIS支持解析json 一. windows XP   1. MIME设置: 在IIS的站点属性的HTTP头设置里,选MIME 映射中点击"文件类型"-"新类型&qu ...

  8. 扩展SpringMVC以支持绑定JSON格式的请求参数

    此方案是把请求参数(JSON字符串)绑定到java对象,,@RequestBody是绑定内容体到java对象的. 问题描述: <span style="font-size: x-sma ...

  9. 【Flex】读取本地XML,然后XML数据转成JSON数据

    干了一年H5,最近被要求写编辑器,Electron等级还不够,写不了,只有重新拿起as3,用flex,最近写到数据表编辑模块,有这部分功能,基本完成 . package utils { /** * 模 ...

随机推荐

  1. JS~字符串长度判断,超出进行自动截取(支持中文)

    今天一个小弟问我的问题,在文本框中输入字符,如果超出指定长度,就把它截取,要求中文等于两个字符的长度,我找一下资料,把这个功能实现了,下面是JS代码: <html> <script ...

  2. Java程序员可能犯的3个常见SQL错误

    概述:Java程序员不仅要具备扎实的Java编程能力,在日常的工作当中往往还要涉及到其他语言的基础知识,尤其是SQL.那么哪些常见的SQL错误是程序员们容易犯的呢?让我们一起来看看吧! 你可能看到Ja ...

  3. Java虚拟机内存区域堆(heap)的管理

    在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域 ...

  4. 数据结构笔记01:编程面试过程中常见的10大算法(java)

    以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: ...

  5. Blade和其他构建工具有什么不同

    大部分人都至少接触过不止一种构建工具,比如make,autotools.而我们开发了Blade,为什么那么多现成的工具不用,而又再造了一个轮子,相对于传统的make等工具,Blade的好处在又哪里呢? ...

  6. 手势识别 GestureDetector ScaleGestureDetector

    识别器GestureDetector基本介绍 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等.一般情况下,我们可以通过View或Activity的onTouch ...

  7. 【Asp.Net】后台生成控件并绑定事件

    在Asp.Net的Web页面处理流程中,有时候我们会碰到需要动态生成的控件,并为之绑定相应的事件. 接下来我们来动态的生成一个控件 //在用户代码初始化阶段添加控件 protected void Pa ...

  8. oracle 复制一条记录只改变主键不写全部列名

    场景:表TEST中有C1,C2,C3...字段,其中C1为主键,先需要复制表TEST中一条(C1='1'的)记录,修改主键列C1和需要变更的列后,再插入到表TEST中. procedure P_TES ...

  9. QML之窗口(无边框、透明及拖拽)

    1.无边框 Qt Quick 2.0 中 QQuickView代替了1.0中的QDeclarativeView. 无边框窗口代码如下: QQuickView viwer; //QQuickView继承 ...

  10. hdu2112(HDU Today 简单最短路)

    Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...