70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
|
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)
|
|||
|
|
|||
|
|