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

转载于:https://www.cnblogs.com/foohack/p/4596864.html

为什么都反对XML而支持使用json呢?相关推荐

  1. .net core webAPI 使其同时支持返回json或xml

    在.netframwork的mvc框架下创建的webapi默认同时支持json和xml. 但是.net core新建的web API默认只支持返回json,如果想要同时支持XML.需要修改下配置. 在 ...

  2. ajax请求json和xml数据及对json和xml格式数据的解析

    ajax请求json和xml数据及对json和xml格式数据的解析 一.ajax请求json数据并解析 ajax的写法: json数据解析: 请求json经常出现的跨域报错: 二.ajax请求xml数 ...

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

    mysql5.7支持的json字段查询 使用示例: 存储结构如下: 1.以json字段作为查询条件:[json字段全部是JSONObject类型的] SELECT * FROMworksheet_da ...

  4. java xml特殊字符转义_Java中将xml文件转化为json遇到特殊字符会报错!

    前言: 我们在项目开发中,有时候调用别人提供的接口,接收到的数据是xml,这时候为了方便后续开发中的使用,需要解析xml并把数据转化成json,今天这篇文章就讲解下如何把xml转化成json,并在这个 ...

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

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

  6. Qt下实现XML、INI、JSON的文件读写示例开发

    文章目录 前言 一.XML文件 二.INI文件 三.JSON文件 四.示例代码及文件内容 五.下载链接 总结 前言 在项目开发过程中,发现经常遇见一些比如XML.INI.JSON等文件的读写,这里对这 ...

  7. 使用sax将xml文件转成json

    SAX是解析XML文档是一种"基于事件的模型".基于SAX的解析器在处理文档时,会生成名为"事件"的通知信息.软件程序可"侦听"这些事件,以 ...

  8. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件

    导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件 参考文章: (1)导入数据任务(id:373985)异常, 错误信 ...

  9. 无论腾讯是自主开放还是被开放,我们都表示欢迎和支持

    我觉得今天对于腾讯来说是很特殊的日子,可以当作是"开放日",今天各大网站都在第一时间发布了腾讯的<开放QQ空间第一步>,确实这一消息令无数人感觉到振奋不已.这也是201 ...

最新文章

  1. Codeforces Round #672 (Div. 2)D. Rescue Nibel![扫描线解决区间问题]
  2. python怎么打开交互式窗口-如何在交互式环境中执行Python程序
  3. 剑指offer例题——二维数组中的查找
  4. 数字身份的一些应用和方案
  5. python的pandas包使用教程_「Python」pandas入门教程
  6. TeamToy - 创新团队的效率工具 一个好用的 团队协作软件
  7. Matlab之rand(), randn(), randi()函数的使用方法
  8. aspnet_regsql
  9. dorado 7 怎么样_一点点奶茶怎么样?消费者眼中的网红奶茶
  10. 实例讲解策略产品经理工作内容
  11. 【深入浅出etcd系列】1. 架构概览
  12. 测试人必备实用技能:写出一份好的Bug报告
  13. ORACLE字符集基础知识
  14. 高清银行LOGO图片整合分享
  15. PHP将swf转为gif,swf转gif 在线转换
  16. 中国电信物联网平台入门学习笔记2: DOME程序分析
  17. Ubuntu18.04 tc指令模拟网络丢包与延时
  18. Justinmind使用教程(6)——Justinmind的切换事件toggle
  19. 《奋斗》中的经典台词
  20. MobPush 创建推送

热门文章

  1. 无法启动SQL Server 2005中的SQL Server(MSSQLSERVER)服务--zt
  2. Python-字符串的常用方法
  3. php auth和rbac区别,THINKPHP中的AUTH权限管理介绍
  4. 这有8个小秘诀,让你更懂CSS!
  5. opencv_图像反转
  6. mysql5.7.14启动教程_mysql5.7.14安装配置方法图文详细教程
  7. python二维数据读取对齐_python代码要严格对齐
  8. python项目结构图_python项目
  9. java connection 单例_Java设计模式之单例模式详解
  10. python zope 工作流_使用C语言来扩展Python程序和Zope服务器的教程