1.轉(zhuǎn)換:對(duì)象與json
import json
from typing import Dict
class Person:
def __init__(self, name: str = 'xiaomiao'):
self.name = name
@staticmethod
def to_dict(obj: 'Person'):
return obj.__dict__
@classmethod
def from_dict(cls, dict: Dict)->'Person':
p = cls()
p.__dict__ = dict
return p
class Female(Person):
def __init__(self, name: str = 'xiao', sex: int = 1):
self.name = name
self.sex = sex
def test_1():
p = Person('xiao')
json1 = json.dumps(p, default=Person.to_dict)
assert '{"name": "xiao"}' == json1, 'json dump error'
p2 = json.loads(json1, object_hook=Person.from_dict)
assert p.__dict__ == p2.__dict__, 'json loads error'
def test_2():
p_list = [Person('xiao1'), Person('xiao2')]
json1 = json.dumps(p_list, default=Person.to_dict)
assert '[{"name": "xiao1"}, {"name": "xiao2"}]' == json1, 'json dump 2 error'
p2_list = json.loads(json1, object_hook=Person.from_dict)
assert p_list[0].__dict__ == p2_list[0].__dict__ and p_list[1].__dict__ == p2_list[1].__dict__, 'json loads 2 error'
def test_3():
p = Female(name='xiao1', sex=1)
json1 = json.dumps(p, default=Female.to_dict)
assert '{"name": "xiao1", "sex": 1}' == json1, 'json dump error'
p2 = json.loads(json1, object_hook=Female.from_dict)
assert p.__dict__ == p2.__dict__, 'json loads error'
2.轉(zhuǎn)換:對(duì)象集合與json列表
import importlib
import json
from typing import Dict
class Person1:
def __init__(self, name: str = 'xiao'):
self.name = name
class Person:
def __init__(self, name: str = 'good'):
self.name = name
self.p1:Person1 = None
@staticmethod
def to_dict_pure(obj: 'Person'):
return obj.__dict__
@staticmethod
def to_dict(obj: 'Person'):
obj.__dict__.update(
{'fullname': f'{obj.__module__}.{obj.__class__.__name__}'})
return obj.__dict__
@staticmethod
def from_dict(dict: Dict)->'Person':
module, classname = dict['fullname'].rsplit('.', 1)
p = getattr(importlib.import_module(module), classname)()
p.__dict__ = dict
return p
def test_1():
p = Person('xiao')
p.p1 = Person1('xinmiao')
json1 = json.dumps(p, default=Person.to_dict)
assert '{"name": "xiao", "p1": {"name": "xinmiao", "fullname": "test_obj_conv_2.Person1"}, ' +\
'"fullname": "test_obj_conv_2.Person"}' == json1, 'json dumps error'
p2 = json.loads(json1, object_hook=Person.from_dict)
assert p.__dict__['name'] == p2.__dict__['name'] \
and p.__dict__['p1'].__dict__ == p2.__dict__['p1'].__dict__, 'json loads error'
def test_2():
p1 = Person('xiao1')
p1.p1 = Person1('xin1')
p2 = Person('xiao2')
p2.p1 = Person1('xin2')
p_list = [p1, p2]
json1 = json.dumps(p_list, default=Person.to_dict)
assert '[{"name": "xiao1", "p1": {"name": "xin1", "fullname": "test_obj_conv_2.Person1"},' +\
' "fullname": "test_obj_conv_2.Person"}, {"name": "xiao2", "p1": {"name": "xin2", ' +\
'"fullname": "test_obj_conv_2.Person1"}, "fullname": "test_obj_conv_2.Person"}]', 'json dumps 2 error'
p2_list = json.loads(json1, object_hook=Person.from_dict)
assert p_list[0].__dict__['name'] == p2_list[0].__dict__['name'] \
and p_list[0].__dict__['p1'].__dict__ == p2_list[0].__dict__['p1'].__dict__ \
and p_list[1].__dict__['name'] == p2_list[1].__dict__['name'] \
and p_list[1].__dict__['p1'].__dict__ == p2_list[1].__dict__['p1'].__dict
審核編輯:劉清
-
python
+關(guān)注
關(guān)注
57文章
4876瀏覽量
90024 -
ASSERT
+關(guān)注
關(guān)注
0文章
17瀏覽量
7660 -
JSON
+關(guān)注
關(guān)注
0文章
128瀏覽量
7780
發(fā)布評(píng)論請(qǐng)先 登錄
JSON:簡(jiǎn)潔代碼高效搞定序列化與反序列化
極簡(jiǎn)代碼,搞定JSON序列化與反序列化
cJSON庫(kù)是什么?
詳解DBC的Signal與JSON文本結(jié)合
沒(méi)有專利的opencv-python 版本
解析淘寶拍立淘按圖搜索API接口與JSON數(shù)據(jù)示例參考
harmony-utils之JSONUtil,JSON工具類
harmony-utils之TempUtil,溫度轉(zhuǎn)換工具類
迅為RK3568開(kāi)發(fā)板編寫(xiě)bundle.json文件
不用聯(lián)網(wǎng)不用編程,PLC通過(guò)智能網(wǎng)關(guān)快速實(shí)現(xiàn)HTTP協(xié)議JSON格式與MES等系統(tǒng)平臺(tái)雙向數(shù)據(jù)通訊
python之對(duì)象和json互相轉(zhuǎn)換
評(píng)論