zoukankan      html  css  js  c++  java
  • 为什么都反对XML而支持使用json呢?

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

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

    原来必须大炮打蚊子的地方,人们发现苍蝇拍更顺手了而已。就像 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

  • 相关阅读:
    (六)静态域,静态方法和静态代码块
    (五)final修饰符
    (四)函数的参数传递——值传递
    (三)java字符串
    第二章 shell的语法
    字符串操作
    PropertyGrid—属性类别排序
    PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框
    PropertyGrid--为复杂属性提供编辑功能
    PropertyGrid—添加EventTab
  • 原文地址:https://www.cnblogs.com/foohack/p/4596864.html
Copyright © 2011-2022 走看看