序列化与反序列化的概念:
在计算机当中,把对象(变量)从内存转变成可以存储或者可以传输的过程称之为序列化,python当中叫做picking
按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,将内存数据转换成字节序列,并输出到文件,即为序列化;反之,从文件当中将字节序列恢复为内存,称为反序列化
python当中可以实现该操作的模块有json、pickle
json的方法如下:
dumps | 将python的对象序列化,从内存直接转换成可存储或可传输 |
loads | 将序列化之后的内容反序列化,直接转换成python中可正常使用的object |
dump | 序列化中,必须要加入文件指针 |
load | 反序列化中,必须要加入文件指针 |
1、json.dumps(obj)
import json
data = {
'python':99,
'java':99,
'c++':99
}
res = json.dumps(data)
print('字典:',data)
print('字符串:',res)
2、json.loads(obj)
res1 = json.loads(res)
print('反序列化',res1)
for key, value in res1.items():
print('%s->%s'%(key, value))
3、json.dump(obj, fp)
# dump 方法 write and read
with open('test_json_dump.txt', 'w', encoding = 'utf-8') as fw:
res = json.dump(data, fw)
with open('test_json_dump.txt', encoding = 'utf-8') as fr:
content = fr.read()
print('序列化', content)
4、json.load(fp)
# dump
with open('test_json_dump.txt', 'w', encoding = 'utf-8') as fw:
res = json.dump(data, fw)
# load
with open('test_json_dump.txt', encoding = 'utf-8') as fr:
res1 = json.load(fr)
dict_1 = {k:v for k,v in res1.items()}
print('反序列化', dict_1)
基本使用详解
1、json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
使用这个转换表将obj序列化为JSON格式化流形式的fp(支持.write()的文件对象) |
如果skipkeys是true,那么那些不是基本对象的字典的键会被跳过,否则引发TypeError |
基本对象:str、int、float、bool、None |
json模块始终产生str对象并非bytes对象。fp.write()必须支持str输入 |
如果ensure_ascii是true,输出保证将所有输入的非ASCII字符转义。如果ensure_ascii是false,这样字符会原样输出。 |
如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "",则只会添加换行符。None``(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如 ``"\t"),那个字符串会被用于缩进每一层。 |
当指定时,separators 应当是一个 (item_separator, key_separator) 元组。当 indent 为 None 时,默认值取 (', ', ': '),否则取 (',', ': ')。为了得到最紧凑的 JSON 表达式,你应该指定其为 (',', ':') 以消除空白字符。 |
如果 sort_keys 是 true(默认为 False),那么字典的输出会以键的顺序排序。 |
2、json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
使用这个 转换表 将 obj 序列化为 JSON 格式的 str。 其参数的含义与 dump() 中的相同。
注意: JSON 中的键-值对中的键永远是 str 类型的。当一个对象被转化为 JSON 时,字典中所有的键都会被强制转换为字符串。这所造成的结果是字典被转换为 JSON 然后转换回字典时可能和原来的不相等。换句话说,如果 x 具有非字符串的键,则有 loads(dumps(x)) != x
下面举一个例子:
import json
data = {
99:'python',
100:'java',
101:'c++'
}
res = json.dumps(data)
print('序列化',res)
res1 = json.loads(res)
print('反序列化',res1.keys())
print('原数据',data.keys())
result = json.loads(json.dumps((1.93,))) == (1.93,)
print(result)
在下图当中我们可以明显的看到,原来的数据中keys是int类型,但是经过序列化再反序列化之后keys就变成了str类型,就有了 loads(dumps(x)) != x
3、json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
使用这个 转换表 将 fp (一个支持 .read() 并包含一个 JSON 文档的 text file 或者 binary file) 反序列化为一个 Python 对象。 |
object_hook 是一个可选的函数,它会被调用于每一个解码出的对象字面量(即一个 dict)。object_hook 的返回值会取代原本的 dict。这一特性能够被用于实现自定义解码器(如 JSON-RPC 的类型提示)。 |
object_pairs_hook 是一个可选的函数,它会被调用于每一个有序列表对解码出的对象字面量。 object_pairs_hook 的返回值将会取代原本的 dict 。这一特性能够被用于实现自定义解码器。如果 object_hook 也被定义, object_pairs_hook 优先。 |
parse_float ,如果指定,将与每个要解码 JSON 浮点数的字符串一同调用。默认状态下,相当于 float(num_str) 。可以用于对 JSON 浮点数使用其它数据类型和语法分析程序 (比如 decimal.Decimal )。 |
parse_int ,如果指定,将与每个要解码 JSON 整数的字符串一同调用。默认状态下,相当于 int(num_str) 。可以用于对 JSON 整数使用其它数据类型和语法分析程序 (比如 float )。 |
parse_constant ,如果指定,将要与以下字符串中的一个一同调用: '-Infinity' , 'Infinity' , 'NaN' 。如果遇到无效的 JSON 数字则可以使用它引发异常。 |
4、json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
使用这个 转换表 将 s (一个包含 JSON 文档的 str, bytes 或 bytearray 实例) 反序列化为 Python 对象。 |
如果反序列化的数据不是有效 JSON 文档,引发 JSONDecodeError 错误。 |
在 3.6 版更改: s 现在可以为 bytes 或 bytearray 类型。 输入编码应为 UTF-8, UTF-16 或 UTF-32。 在 3.9 版更改: 关键字参数 encoding 已被移除。 |
注意
这个模块的编码器和解码器默认保护输入和输出的顺序。仅当底层的容器未排序时才会失去顺序。
在 Python 3.7 之前,dict 并不保证有序,因此输入和输出通常都是乱序的,除非是明确地请求 collections.OrderedDict。 从 Python 3.7 开始,普通的 dict 会保留顺序,因此不必再为 JSON 的生成和解析指定使用 collections.OrderedDict。
转换关系
编码
Python | JSON |
dict | object |
list, tuple | array |
str | string |
int, float, int 和 float 派生的枚举 | number |
True | true |
False | false |
None | null |
解码
JSON | Python |
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |