本文总结一点python标准库中json模块的使用。json主要是异种用于程序之间的数据交换格式,关于json本身,请参考:json数据格式。
使用json模块,其实就是对数据进行序列化和反序列化的操作。python对于这类操作,接口函数的命令是比较统一的,都是load,dump,loads,dumps这样的,比如pickle模块。
json模块接口产生的数据都是str!
python对象和json数据类型的对应关系:
JSONPythonobjectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone
load和dump
load和dump,后面没有带s,表示是对文件进行操作。load,读取文件,dump,写入文件,中间当然就是按照json格式进行反序列化和序列化的操作。
>>> import json
>>> f = open('tt.json')
>>> data = json.load(f)
>>> data
{'fromaddr': 'from@qq.com', 'passwd': '123456789', 'server': 'smtp.qq.com', 'port': 587, 'connect': 'tls', 'timeout': 3, 'debuginfo': False, 'msg': [{'subject': 'test json file', 'to': 'to@qq.com', 'cc': None, 'bcc': None, 'type': 'plain', 'content': '人生hahaha...lalala...'}, {'subject': 'test json file', 'to': 'to@qq.com', 'cc': None, 'bcc': None, 'type': 'html', 'content': '
2222...hahaha...lalala...'}]}
>>> type(data)
>>> f.tell()
610
>>> f.close()
data通过json.load接口,直接就成为了一个dict对象。
>>> g = open('tt2.json_dump', 'w')
>>> json.dump(data, g)
>>> g.tell()
426
>>> g.close()
>>> os.system('bash')
$ cat tt2.json_dump
{"fromaddr": "from@qq.com", "passwd": "123456789", "server": "smtp.qq.com", "port": 587, "connect": "tls", "timeout": 3, "debuginfo": false, "msg": [{"subject": "test json file", "to": "to@qq.com", "cc": null, "bcc": null, "type": "plain", "content": "\u4eba\u751fhahaha...lalala..."}, {"subject": "test json file", "to": "to@qq.com", "cc": null, "bcc": null, "type": "html", "content": "
2222...hahaha...lalala..."}]}
将一个dict对象,直接dump进一个文件。
loads和dumps
这两个函数后面带s,表示操作对象是str对象,其它都一样。
>>> data
{'a': [1, 2, 3, 4, 5], 'b': [5, 4, 3, 2, 1]}
>>> json.dumps(data)
'{"a": [1, 2, 3, 4, 5], "b": [5, 4, 3, 2, 1]}'
>>> json.loads(json.dumps(data))
{'a': [1, 2, 3, 4, 5], 'b': [5, 4, 3, 2, 1]}
json模块还有一个工具tool,可以用来在命令行检查json数据并美化输出。
python官方对json模块的说明页:https://docs.python.org/3/library/json.html#module-json,使用上的细节就要到这里去查阅了。
json.dump和json.dumps这两函数,如果给indent=4参数,就可以实现pretty output的效果。json.tool就是这么干的!
-- EOF --