• JSON数据格式


    1.概念

     
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。
    JSON的意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。
    XML也是一种数据交换格式,因为XML虽然可以作为跨平台的数据交换格式,但是在JS中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。

    JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

     
    2.JSON的两种结构
     

    JSON基于两种结构:

    1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

    2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array),矢量(vector),列表(list),序列(sequence)。

    JSON有两种表示结构,对象和数组
    ①对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

    {
        key1:value1,
        key2:value2,
        ...
    }

    其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组

    ②数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

    [
        {
            key1:value1,
            key2:value2 
        },
        {
             key3:value3,
             key4:value4   
        }
    ]
     
    JSON具有以下这些形式:
    对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔;
    JSON 对象
    JSON 对象
    数组(array);
    JSON 数组
    值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套;
    JSON 值
    字符串(string) 是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string);
    JSON的字符串(string)与C或者Java的字符串非常相似;
    JSON 字符串
    数值(number) 也与C或者Java的数值非常相似。只是JSON的数值没有使用八进制与十六进制格式;
    JSON 数值
    同时,可以在任意标记之间添加空白。
     
    3.JSON字符串
    字符串:这个很好解释,指使用“”双引号或’’单引号包括的字符。例如:var comStr = 'this is string';
    json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = "{StudentID:'100',Name:'tmac',Hometown:'usa'}";
    json对象:指符合json格式要求的js对象。例如:var jsonObj = { StudentID: "100", Name: "tmac", Hometown: "usa" };

    4.在JS中如何使用JSON

    JSON是JS的一个子集,所以可以在JS中轻松地读写JSON。读和写JSON都有两种方法,分别是利用”.”操作符和“[key]”的方式。

    我们首先定义一个JSON对象,代码如下:

    var obj = {
                1: "value1",
                "2": "value2",
                count: 3,
                person: [ //数组结构JSON对象,可以嵌套使用
                            {
                                id: 1,
                                name: "张三"
                            },
                            {
                                id: 2,
                                name: "李四"
                            }
                       ],
                object: { //对象结构JSON对象
                    id: 1,
                    msg: "对象里的对象"    
                }
            };
    ①从JSON中读数据:
    function ReadJSON() {
                alert(obj.1); //会报语法错误,可以用alert(obj["1"]);说明数字最好不要做关键字
                alert(obj.2); //同上
     
                alert(obj.person[0].name); //或者alert(obj.person[0]["name"])
                alert(obj.object.msg); //或者alert(obj.object["msg"])
            }
     
    ②向JSON中写数据:

    比如要往JSON中增加一条数据,代码如下:

    function Add() { 
                //往JSON对象中增加了一条记录
                obj.sex= "男" //或者obj["sex"]="男"
            }
    ③修改JSON中数据:
    我们现在要修改JSON中count的值,代码如下:
    function Update() {
                obj.count = 10; //或obj["count"]=10
            }

    ④删除JSON中的数据:
    我们现在实现从JSON中删除count这条数据,代码如下:
    function Delete() {
                delete obj.count;
            }

    ⑤遍历JSON中的数据:
    可以使用for…in…循环来遍历JSON对象中的数据,比如我们要遍历输出obj对象的值,代码如下:
    function Traversal() {
                for (var c in obj) {
                    console.log(c + ":", obj[c]);
                }
            }

     

    5.JSON和XML的比较

    可读性

    JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

    可扩展性

    XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,而JSON却不能。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

    编码难度

    XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。

    解码难度

    XML的解析方式有两种:

    一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。

    另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。

    凡是这样可扩展的结构数据解析起来一定都很困难。

    JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。

    而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串,这样仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。

    以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

    实例比较

    XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

    用XML表示中国部分省市数据如下:

    <?xml version="1.0" encoding="utf-8"?>

    <country>

        <name>中国</name>

        <province>

            <name>黑龙江</name>

         <cities>

                <city>哈尔滨</city>

                <city>大庆</city>

            </cities>

        </province>

        <province>

            <name>广东</name>

            <cities>

                <city>广州</city>

                <city>深圳</city>

                <city>珠海</city>

            </cities>

        </province>

    </country>

    用JSON表示如下:

    {

    {name:"中国", province:[ { name:"黑龙江", cities:{ city:["哈尔滨","大庆"] },

    {name:"广东", cities:{ city:["广州","深圳","珠海"] } 

    }

    编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过json的索引.province[0].name就能够读取“黑龙江”这个值。

    编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。

     

    参考:http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html

             http://www.cnblogs.com/SkySoot/archive/2012/04/17/2453010.html

  • 相关阅读:
    swift锁屏播放,音乐进度更新,专辑,歌手名显示
    swift Dictionary 字典
    Swift中的集合类型
    Swift String 一些常用方法
    Swift自定义Class实现Hashable
    二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))
    BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution
    [DEEP LEARNING An MIT Press book in preparation]Linear algebra
    POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量
    c#-RTF文本编辑器
  • 原文地址:https://www.cnblogs.com/xujiming/p/5452747.html
Copyright © 2020-2023  润新知