• python操作json


    概念

    序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON、XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

    JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。

    Python2.6开始加入了JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encoding和 decoding

    encoding:把一个Python对象编码转换成Json字符串
    decoding:把Json格式字符串解码转换成Python对象
    对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。

    json.dumps方法对简单数据类型encoding:
    import json
    data = [{'a':"A",'b':(2,4),'c':3.0}]  #list对象
    print "DATA:",repr(data)
    
    data_string = json.dumps(data)
    print "JSON:",data_string
    

    输出:

    DATA: [{'a':'A','c':3.0,'b':(2,4)}] #python的dict类型的数据是没有顺序存储的
    JSON: [{"a":"A","c":3.0,"b":[2,4]}]  
    

    JSON的输出结果与DATA很相似,除了一些微妙的变化,如python的元组类型变成了Json的数组,Python到Json的编码转换规则是: python2json

    json.loads方法处理简单数据类型的decoding(解码)转换
    import json
    data = [{'a':"A",'b':(2,4),'c':3.0}]  #list对象
    
    data_string = json.dumps(data)
    print "ENCODED:",data_string
    
    decoded = json.loads(data_string)
    print "DECODED:",decoded
    
    print "ORIGINAL:",type(data[0]['b'])
    print "DECODED:",type(decoded[0]['b'])
    

    输出:

    ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]
    DECODED: [{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]
    ORIGINAL: <type 'tuple'>
    DECODED: <type 'list'>
    

    解码过程中,json的数组最终转换成了python的list,而不是最初的tuple类型,Json到Python的解码规则是: json2python

    json的人文关怀

    编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性,如sort_keys是告诉编码器按照字典排序(a到z)输出。

    import json
    
    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
    print 'DATA:', repr(data)
    
    unsorted = json.dumps(data)
    print 'JSON:', json.dumps(data)
    print 'SORT:', json.dumps(data, sort_keys=True)
    

    输出:

    DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
    JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
    SORT: [{"a": "A", "b": [2, 4], "c": 3.0}
    

    indent参数根据数据格式缩进显示,读起来更加清晰:

    import json
    
    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
    print 'DATA:', repr(data)
    
    print 'NORMAL:', json.dumps(data, sort_keys=True)
    print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)
    

    输出:

    DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
    NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
    INDENT: [
      {
        "a": "A",
        "b": [
          2,
          4
        ],
        "c": 3.0
      }
    ]
    

    separators参数的作用是去掉,,:后面的空格,从上面的输出结果都能看到", :"后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数:

    import json
    
    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
    print 'DATA:', repr(data)
    print 'repr(data)             :', len(repr(data))
    print 'dumps(data)            :', len(json.dumps(data))
    print 'dumps(data, indent=2)  :', len(json.dumps(data, indent=2))
    print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))
    

    输出:

    DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
    repr(data)             : 35
    dumps(data)            : 35
    dumps(data, indent=2)  : 76
    dumps(data, separators): 29
    

    skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理.

    import json
    
    data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]
    
    try:
        print json.dumps(data)
    except (TypeError, ValueError) as err:
        print 'ERROR:', err
    print 
    print json.dumps(data, skipkeys=True)
    

    输出:

    ERROR: keys must be a string
    
    [{"a": "A", "c": 3.0, "b": [2, 4]}]


    http://liuzhijun.iteye.com/blog/1859857
  • 相关阅读:
    Python04 range()方法的使用、turtle.textinput()方法和write()的使用、turtle.numinput()的使用
    SpringBoot12 QueryDSL02之利用QueryDSL实现多表关联查询
    SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL、利用QueryDSL实现单表RUD、新增类初始化逻辑
    ES02 变量、数组、对象、方法
    JavaScript问题01 js代码放在header和body的区别
    Python03 字符串类型、强制类型转化、列表、元组、字典、集合
    Python02 标准输入输出、数据类型、变量、随记数的生成、turtle模块详解
    使用 Multipath TCP 为 iOS 创建备份连接(转)
    linux中的条件变量
    linux中网络编程<1>
  • 原文地址:https://www.cnblogs.com/youxin/p/4057990.html
Copyright © 2020-2023  润新知