zoukankan      html  css  js  c++  java
  • Python: json模块实例详解

    ref:https://www.jianshu.com/p/e29611244810

     

    https://www.cnblogs.com/qq78292959/p/3467937.html

    https://www.cnblogs.com/diaosicai/p/6419833.html

    https://blog.csdn.net/mr_evanchen/article/details/77880524

    Python: Json实例

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。

    数据格式可以简单地理解为键值对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
    值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

    import json
    

    Pyhton的Json模块提供了把内存中的对象序列化的方法。

    json.dumps

    dump的功能就是把Python对象encode为json对象,一个编码过程。注意json模块提供了json.dumpsjson.dump方法,区别是dump直接到文件,而dumps到一个字符串,这里的s可以理解为string

    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
    print 'DATA:', repr(data)
    
    data_string = json.dumps(data)
    print 'JSON:', data_string
    
    DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
    JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
    

    查看其类型,发现是string对象。

    print type(data)
    print type(data_string)
    
    <type 'list'>
    <type 'str'>
    

    json.dump

    不仅可以把Python对象编码为string,还可以写入文件。因为我们不能把Python对象直接写入文件,这样会报错TypeError: expected a string or other character buffer object,我们需要将其序列化之后才可以。

    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
    
    with open('output.json','w') as fp:
        json.dump(data,fp)
    
    cat output.json
    
    [{"a": "A", "c": 3.0, "b": [2, 4]}]
    

    json.loads

    Python内置对象dumpjson对象我们知道如何操作了,那如何从json对象decode解码为Python可以识别的对象呢?是的用json.loads方法,当然这个是基于string的,如果是文件,我们可以用json.load方法。

    decoded_json = json.loads(data_string)
    
    # 和之前一样,还是list
    print type(decoded_json)
    
    <type 'list'>
    
    # 像访问 data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]一样
    print decoded_json[0]['a']
    
    A
    

    json.load

    可以直接load文件。

    with open('output.json') as fp:
        print type(fp)
        loaded_json = json.load(fp)
    
    <type 'file'>
    
    # 和之前一样,还是list
    print type(decoded_json)
    
    <type 'list'>
    
    # 像访问 data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]一样
    print decoded_json[0]['a']
    
    A
    

    数据类型对应

    jsonPython对象转换过程中,数据类型不完全一致,有对应。

    PythonJson
    dict object
    list,tuple array
    str, unicode string
    int,long,float number
    True true
    False false
    None null

    json.dumps常用参数

    一些参数,可以让我们更好地控制输出。常见的比如sort_keysindentseparatorsskipkeys等。

    sort_keys名字就很清楚了,输出时字典的是按键值排序的,而不是随机的。

    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就是更个缩进,让我们更好地看清结构。

    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是提供分隔符,可以出去白空格,输出更紧凑,数据更小。默认的分隔符是(', ', ': '),有白空格的。不同的dumps参数,对应文件大小一目了然。

    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
    

    json需要字典的的键是字符串,否则会抛出ValueError

    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]
    
    print 'First attempt'
    try:
        print json.dumps(data)
    except (TypeError, ValueError) as err:
        print 'ERROR:', err
    
    print
    print 'Second attempt'
    print json.dumps(data, skipkeys=True)
    
    First attempt
    ERROR: keys must be a string
    
    Second attempt
    [{"a": "A", "c": 3.0, "b": [2, 4]}]
  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/pejsidney/p/9548354.html
Copyright © 2011-2022 走看看