聊一聊python中的JSON

BG39

Posted by Blue Geek on October 25, 2019

聊一聊python中的JSON

By 青衣极客 Blue Geek In 2019-10-25

json的使用已经非常广泛了,主要原因在于这种简洁高效的编码方式。特别是作为配置文件,对人阅读文件而言比较直观,也更有利于维护,同时解析json的模块也是比较轻量级。但是,必须指出的一点是,由于json编写的随意性,在规范的通信协议中并不适合使用json,否则需要进行大量的字段安全性校验,这种情况下使用protobuf更合适一些。而对于日常不太严肃的场合或者配置文件的使用而言,json仍然是一种非常不错的选择。python提供了一个json模块,可以很方便地完成python对象与json格式数据的相互转换,这对于一些配置参数较多的工程而言是一个很不错的消息。本文就讨论一下python中json的使用以及相关数据结构的对应关系。

1. python对象与JSON对象

在导入json模块之后,直接使用dumps函数就可以将python对象转换成json格式数据字符串。以下演示说明了dumps函数的使用方式,从输出可以看到,dumps函数得到的字符串是str类型。

import json

d = {'a':1, 'b':2, 'c':3}
d_json = json.dumps(d)
print('d_json={}, dtype(d_json)={}'.format(d_json, type(d_json)))
d_json={"a": 1, "b": 2, "c": 3}, dtype(d_json)=<class 'str'>

使用loads函数可以将json格式数据字符串转换为python对象。不过需要注意的是,在实际使用中,可能会由于各种原因造成json格式字符串被修改,从而导致解析异常。因此,在实际使用中,最好使用try…except将loads函数包围起来,避免因为异常而导致程序停机。

new_d = json.loads(d_json)
print('new_d={}, type(new_d)={}'.format(new_d, type(new_d)))
new_d={'a': 1, 'b': 2, 'c': 3}, type(new_d)=<class 'dict'>

2. 类型对应关系

dumps和loads这一对函数可以完成python对象和json数据之间的相互转换,那么python对象和json数据类型之间具有怎样的对应关系呢?以下演示正是试图说明这一点。

dic = {'a_list':[1,2,3],'b_tuple':(1,2,3), 'c_str':'hello stirng',
       'd_int': 12, 'e_float':1.2, 'f_bool':True, 'g_none':None}
dic_json = json.dumps(dic)
print(dic_json)
{"a_list": [1, 2, 3], "b_tuple": [1, 2, 3], "c_str": "hello stirng", "d_int": 12, "e_float": 1.2, "f_bool": true, "g_none": null}

从以上演示的输出结果可以看出,python对象与json数据格式具有如下对应关系:

python json
dict 对象object
list,tuple 数组array
str 字符串string
int, float 数值number
True/False true/false
None null

需要注意的是:1.python中list和tuple对应这json中数组array,这意味着json对于list和tuple这两种数据没有区分能力,所以从json转换到python对象时,数组array都转换成list。另外,在json中bool类型和空类型的表示符号与python中存在差异,这对于编写json文件的朋友需要稍加注意。

3. 存取JSON文件

我们使用json比较常见的场合还是json文件,接下来就讨论一下python中将对象写入到json文件以及将json文件载入成python对象的方式。json模块提供了dump函数,可以直接将python对象写入到文件中,只是需要先获得一个文件的迭代对象,并且该文件打开的方式是可写入的。以下演示说明了具体的使用方法。

with open('../../output/test_json.json', 'w') as fid:
    json.dump(dic, fid)
!cat ../../output/test_json.json
{"a_list": [1, 2, 3], "b_tuple": [1, 2, 3], "c_str": "hello stirng", "d_int": 12, "e_float": 1.2, "f_bool": true, "g_none": null}

json模块提供了load函数直接从一个json文件载入成python对象,要求打开文件的方式为可读的。以下演示说明了load函数的具体使用方式。

with open('../../output/test_json.json', 'r') as fid:
    new_dic = json.load(fid)
print(new_dic)
{'a_list': [1, 2, 3], 'b_tuple': [1, 2, 3], 'c_str': 'hello stirng', 'd_int': 12, 'e_float': 1.2, 'f_bool': True, 'g_none': None}

到此,关于python中的json就讨论完毕,本文在编写时参考的英文网页如下:https://medium.com/python-pandemonium/json-the-python-way-91aac95d4041 。这个英文网页中讨论得更多一点的内容,不过日常使用很少用到, 感兴趣的朋友可以阅读这份英文网页的描述。

【青衣极客】公众号



COMMENT

博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题

"BG39-聊一聊python中的JSON"