json的序列化与反序列化
json 是一种轻量级的数据交换格式,也是完全独立于任何程序语言的文本格式。
本文介绍json字符串的序列化与反序列化问题。
序列化 是指将变量(对象)从内存中变成可存储或可传输的过程。 反序列化 是指将变量内容从序列化的对象重新读到内存里的过程。
1、在json模块中,dump()
和 dumps()
都实现了序列化。
dump()
:将dict
对象序列化到文件中(文件中存储json字符串)。
import json
a_dict = {'a': 11, 'b': 22}
a_str = json.dump(a_dict, open('demo.json', 'w'))
dumps()
:将dict
对象序列化为json字符串,仍在内存中。
import json
a_dict = {'a': 11, 'b': 22}
a_str = json.dumps(a_dict)
print(type(a_dict)) # <class 'dict'>
print(type(a_str)) # <class 'str'>
2、在json模块中,load()
和 loads()
都实现反序列化。
load()
:针对文件句柄,从文件中读取json字符转换为dict
。
import json
a_json = json.load(open('demo.json', 'r'))
print(type(a_json)) # <class 'dict'>
print(a_json) # {'a': 11, 'b': 22}
loads()
:针对内存对象,将json字符串转换为dict
。
import json
a_str = '{"a": 11, "b": 22}'
a_json = json.loads(a_str)
print(type(a_json)) # <class 'dict'>
print(a_json) # {'a': 11, 'b': 22}
注意:json字符串的key为单引号时,用json.loads()
会报错。
a_str = "{'a': 11, 'b': 22}"
a_json = json.loads(a_str)
# json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)