Files
Python_CookBook_repo/6.数据编码与处理/2.读写JSON数据.py
2025-09-10 16:12:45 +08:00

70 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
from collections import OrderedDict
if __name__ == '__main__':
# JSON是前后端传输里很常见的东西很多数据要打成JSON字符串才能传输
# 我们一般使用JSON.dumps和JSON.loads
data = {
"name": 'ACME',
"shares": 100,
"price": 542.33
}
data_json = json.dumps(data)
print(data_json)
data = json.loads(data_json)
print(data)
# 但如果是同.json文件打交道还是使用dump和load
# 在加载的时候也可以把json对象载入成OrderedDict或Python对象
data = json.loads(data_json, object_pairs_hook=OrderedDict)
print(data)
class JsonObj:
def __init__(self, transform_data):
self.__dict__ = transform_data
data = json.loads(data_json, object_hook=JsonObj)
print(data.name)
# 在转换为Json时对象这个东西是无法直接被Json解析的想要解析得把它转化成可以被序列化处理的字典
# 我们可以实现一个解析器函数将类的字段映射到字典里load的时候再创建一个类把它反序列化出来
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
classes = {
"Point": Point
}
# 类->Json
def serialize_instance(obj):
d = {'__class__': type(obj).__name__}
d.update(vars(obj))
return d
# JsonStr->类
def unserialize_instance(dic):
cls_name = dic.pop('__class__', None)
if cls_name:
cls = classes[cls_name]
obj = cls.__new__(cls)
for k, v in dic.items():
setattr(obj, k, v)
return obj
else:
return dic
p = Point(2, 3)
s = json.dumps(p, default=serialize_instance)
print(s)
a = json.loads(s, object_hook=unserialize_instance)
print(a.x, a.y)