python-序列化与反序列化之json

序列化与反序列化的概念:

在计算机当中,把对象(变量)从内存转变成可以存储或者可以传输的过程称之为序列化,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。

转换关系

编码

PythonJSON
dictobject
list, tuplearray
strstring
int, float, int 和 float 派生的枚举number
Truetrue
Falsefalse
Nonenull

解码

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
null None
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值