• json数据结构


     JSON即JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合服务器与JavaScript的交互。JSON易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立语言的文本格式,但是也是用了类似于C语言家族的习惯(包括C,C++,C#,JAVA,JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。

    XML也是一种数据交换格式,不过XML标记比较多,往往使得标记比需要传递的数据都还多,这样会增加字符传输的负担。 

    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)。

    Python的json模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多。 下面演示如何将一个Python数据结构转换为JSON:

    import json
     
    data = {
    'name' 'ACME',
    'shares' 100,
    'price' 542.23
    }
     
    json_str = json.dumps(data)
     
    下面演示如何将一个JSON编码的字符串转换回一个Python数据结构:
     
    data = json.loads(json_str)
    如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据。例如:
    # Writing JSON data
    with open('data.json''w') as f:
     json.dump(data, f)
     
    # Reading data back
    with open('data.json''r') as f:
     data = json.load(f)
     

    json.dumps 与 json.loads 实例

    以下实例演示了 Python 数据结构转换为JSON:

    #!/usr/bin/python3
    
    import json
    
    # Python 字典类型转换为 JSON 对象
    data = {
        'no' : 1,
        'name' : 'W3CSchool',
        'url' : 'http://www.w3cschool.cn'
    }
    
    json_str = json.dumps(data)
    print ("Python 原始数据:", repr(data))
    print ("JSON 对象:", json_str)
    

    执行以上代码输出结果为:

    Python 原始数据: {'url': 'http://www.w3cschool.cn', 'no': 1, 'name': 'W3CSchool'}
    JSON 对象: {"url": "http://www.w3cschool.cn", "no": 1, "name": "W3CSchool"}
    

    通过输出的结果可以看出,简单类型通过编码后跟其原始的repr()输出结果非常相似。

    接着以上实例,我们可以将一个JSON编码的字符串转换回一个Python数据结构:

    #!/usr/bin/python3
    
    import json
    
    # Python 字典类型转换为 JSON 对象
    data1 = {
        'no' : 1,
        'name' : 'W3CSchool',
        'url' : 'http://www.w3cschool.cn'
    }
    
    json_str = json.dumps(data1)
    print ("Python 原始数据:", repr(data1))
    print ("JSON 对象:", json_str)
    
    # 将 JSON 对象转换为 Python 字典
    data2 = json.loads(json_str)
    print ("data2['name']: ", data2['name'])
    print ("data2['url']: ", data2['url'])
    

    执行以上代码输出结果为:

    ython 原始数据: {'name': 'W3CSchool', 'no': 1, 'url': 'http://www.w3cschool.cn'}
    JSON 对象: {"name": "W3CSchool", "no": 1, "url": "http://www.w3cschool.cn"}
    data2['name']:  W3CSchool
    data2['url']:  http://www.w3cschool.cn
    

    如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据。例如:

    # 写入 JSON 数据
    with open('data.json', 'w') as f:
        json.dump(data, f)
    
    # 读取数据
    with open('data.json', 'r') as f:
        data = json.load(f)
    主流的数据交换格式有两种:XML 、JSON
    3  iOS 开发常见的解析 :
    3.1  XML 解析 :SAX 解析和DOM 解析
           XML 解析工具:NSXMLParser、GDataXMLNode、TouchXML 和 KissXML 等
    3.2 JSON 解析
    解析工具:JSONKit、NSJSONSerialization、TouchJSON和SBJSON等,其中NSJSONSerialization(系统提供的解析类,性能最好的,解析效率最高)
     
    二 XML数据结构
    ----XML------
    1 可扩展标记语言(eXtensible Markup Language):存储数据和传送数组
    2 跟 JSON 解析一样,常用于交互数据格式
    3 一般 XML 文档 (XML Document)
    4 举例 :
        <student> 【标签,表示开始】
            <name>你</name>
            <hobby>女</hobby>
        </student> 【标签,表示结束】
    5 XML 文档的语法:
    5.1 文档声明:在 XML 文档最前面,必须写一个文档声明
        a 最简单的声明 :<?xml version = "1.0"?>
        b 用encoding 属性,来说明文档字符编码:<?xml version = "1.0" encoding = "UTF-8"?>
    5.2 元素(Element):一个元素,会包含一个开始标签和一个结束标签
        a 有所有内容:<name>你</name>
        b 无元素内容:<name></name>
        而且一个元素可嵌套若干个子元素,但不能出现交叉嵌套
    <students>
        <student> 【标签,表示开始】
            <name>你</name>
            <hobby>女</hobby>
        </student> 【标签,表示结束】
    <stdudents>
        ** 注意 : 1 规范的 XML 文档最多只有一个根元素,其他的都是根元素的子孙元素。
                  2 在 XML 中,空格和换行,都会被当做具体内容去处理,例如: a和b 是不一样的
                    a <name>你</name>
                    b <name>
                        你
                      </name>
    5.3 属性(Atribute):一个元素可以拥有多个属性,例如
            <video name="小黄人" hobby="apple"/>【video 元素拥有 name,hobby两个属性】
        *注意 : 属性的值必须用 "" 或者 '' 括住
        *属性表示的信息,也可用子元素来表示,例如:
        <video>
            <name>小黄人</name>
            <hobby>apple</hobby>
        </video>
    6 对 XML 文档的解析:
        提取 name 元素里面的内容:<name>小黄人</name>
        或者是提取 video 元素中 name 和 hobby 的值 :<video name="小黄人" hobby="apple"/>
    7 ---  SAX 解析 ---- Simple API for XML
    SAX: 基于事件驱动的解析方式,逐行解析数据(采用协议回调机制)
    NSXMLParser 是 iOS 自带的 XML 解析类,采用 SAX 方式解析数据
    解析过程由 NSXMLParserDelegate 协议方法回调
    <students>
        <student>
            <name>你</name>
            <hobby>女</hobby>
        </student>
    </students>
    a 解析方式,逐行进行解析。
    a.1 打开 XML 文档
    a.2 开始节点(开始标签)
    a.3 逐行进行解析
    a.4 发现元素里面的内容
    a.5 提取内容
    a.6 结束节点(结束标签)
    a.7 循环开始,直到遇到 根元素的结束标签,解析才彻底结束
     
    b iOS 中 XML 解析方式有狠多
    b.1 苹果原生: NSXMLParser -- SAX 方式解析,使用简单
    b.2 第三方框架:
        1 libxm12 : 纯 C 语言,默认被包含进了 iOS SDk
        2 GDataXML :DOM 的解析方式,是由谷歌开发的,底层基于 libxml2
     
     
    8 ---DOM 解析----
     
    a Document Object Model (文档对象模型),将整个 XML 文档读入,将构建驻留内存的树结果(节点数),通过遍历树结构的任意XML节点,读取它的属性和值,而且通常情况下,可以借助XPath,直接查询 XML 节点
    b 步骤:
    b.1 获取 GDataXMLNode.h/m 文件,将 GDataXMLNode.m 添加到所需工程
    b.2 添加类库 libxml2.tbd 到工程中    libxml2.dylib(iOS7 之前)
    b.3 在工程中的“Build settings”页面中找到“Header search path”项,添加 /usr/include/libxml2
    b.4 导入 GDataXMLNode.h 文件到头文件中,如编译成功,则 GDataXMLNode 添加成功
     
    c 属性和方法
    name 取标签名
    attributeForName 取属性节点
    stringValue 取标签间的字符串
    rootElement 子节点
     
    三 JSON 数据结构
    1 JSON (JavaScript Object Notation) ,轻量级的数据交换格式,是基于 JS 的一个子集,是完全采用独立语言的文本格式,容易阅读和编写,易于机器解析和生成,非常适合于服务器和客户端的交互
    2 注意: 标准的JSON格式:Key 必须使用双引号
    3 JSON 数据结构的语法
    3.1中的数据类型 : 字符串、数值、BOOL、对象、数组
    3.2文件中有两种结构:
    对象 、数组
    3.3 JSON - OC : 两者对应的数据类型
        a JSON 中的大括号 {},在OC 中 NSDictionary
        b JSON 中的方括号 [], 在OC 中表示 NSArray
        c JSON 中的双引号 "", 在OC 中表示 NSString
    4 JSON 数据结构的功能
    数据交换、内容管理、配置文件
    5 在 iOS 中常见的 JSON 解析方式:
     5.1 原声(自带):NSJSONSerialization(性能最好的)
              NSJSONSerialization 里面包含了两个方法来通过不同数据形式解析JSON数据
    5.1.1  +JSONObjectWithData: options: error: 使用缓冲区数据解析JSON
    5.1.2  +writeJSONObject: toStream: options: error: 使用文件流的行式解析JSON
     5.2 第三方:JSONKit、SBJSON、TouchJSON(依次从左到右,越来越差)
    objectFromJSONData
    四 XML 与 JSON 两种数据结构的优缺点
    1.XML与JSON两种数据结构的优缺点

     1> XML
     优点:u2028

    • 格式统一, 符合标准u2028

    • 容易与其他系统进行远程交互, 数据共享比较方便

    u2028 缺点:

    • XML文件格式文件庞大, 格式复杂, 传输占用带宽u2028

    • 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护

    • 客户端不同,浏览器之间解析XML的方式不一致, 需要重复编写很多代码u2028

    • 服务器端 和 客户端 解析XML花费资源和时间

     2> JSON
     优点:u2028

    • 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小u2028

    • 易于解析这种语言 

    • 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析u2028

    • 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护u2028

     缺点:u2028

    • 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性u2028

    • JSON格式目前在Web Service中推广还属于初级阶段

    2.JSON、XML解析方式的底层实现

     1> XML

      Xml两种解析方式,DOM 和 SAX。

      DOM 需要读入整个XML文档(文档驱动),SAX 是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。

      SAX 简单地说就是对XML文档进行顺序扫描,当扫描到 文档 的 开始 与 结束 ,元素(element)的 开始 与 结束 时,就会触发相应的事件处理 函数,由事件处理函数做相应的动作,处理完后继续扫描,直到文档结束,则解析完毕

      DOM 解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许你使用 DOM API 操作 XML 树。也就是说,DOM 会把XML以 树 的形式读取到内存中,然后在通过相应的 API 来操作这个 XML树,从而达到解析XML文件的目的

     2> JSON

      json底层原理 遍历字符串中的字符,最终根据特助字符,比如{},[],:号等进行区分,{}是字典,[]表示的是数组,:号是字典的键和值的分水岭,最后是将json数据转化为字典,然后使用 KVC 将字典转为 model

    3 选择推荐

    1)对于复杂的数据结构使用XML,简单的数据结构可采用JSON。

    2)在互联网应用中数据传输中,提倡使用JSON。

     
    3)针对前后端的差异,可以在服务端使用XML,在前端使用JSON,两者之间的转换在服务器端完成。这样可以各取所长
  • 相关阅读:
    http连接池
    消息队列场景简介
    项目中使用到的设计模式
    dubbo 问题整理
    dubbo Filter
    Elastic-Job分布式作业框架
    别被平凡淹没
    spring中@value注解需要注意
    穷人的真相:从7点忙到23点的上班者,跳出穷人圈子唯一可能是.
    ContextLoaderListener类(spring源码解析)
  • 原文地址:https://www.cnblogs.com/klb561/p/9147726.html
Copyright © 2020-2023  润新知