1.json模块可以将python的数据格式转换为json格式的数据,也可以将json格式数据转换为python的数据格式
- json格式,是一个数据格式(本质上就是个字符串,常用于网络数据传输)
- json格式的作用:跨语言数据传输(语言不同,基础数据类型格式都不同)
2.Python数据类型与json格式相互转换:
- Python数据类型 -> json,一般称为:序列化
- json格式 -> Python数据类型,一般称为:反序列化
json模块中常用:
- json.dumps,序列化生成一个字符串
- json.loads,反序列化生成python数据类型
- json.dump,将数据序列化并写入文件
import json
data = [{"id": 1, "name": "a1", "age": 11},
{"id": 2, "name": "a2", "age": 22}]
with open('info.json', mode='w', encoding='utf-8') as f:
json.dump(data, f)
- json.load,读取文件中的数据并反序列化为python的数据类型
import json
with open('info.json', mode='r', encoding='utf-8') as f:
data = json.load(f)
print(data)
3. python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
python类型 | dict | list/tuple | str | int/float | True | False | None |
---|
json类型 | object | array | string | number | true | false | null |
其他类型如果想要支持,需要自定义JSONEncoder 才能实现,eg:
import json
from decimal import Decimal
from datetime import datetime
data = [{"id": 1, "name": "a1", "age": 11, "size": Decimal("18.88"), "ctime": datetime.now()},
{"id": 2, "name": "a2", "age": 22, "size": Decimal("9.99"), "ctime": datetime.now()}]
class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
if type(o) == Decimal:
return str(o)
elif type(o) == datetime:
return o.strftime("%Y-%M-%d")
return super().default()
res = json.dumps(data, cls=MyJSONEncoder)
print(res)