131 lines
3.5 KiB
Python
131 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
JSON数据转换工具
|
|
用于将JSON数据转换为Python对象
|
|
"""
|
|
|
|
class DictObject:
|
|
"""将字典转换为对象,使得可以通过属性访问"""
|
|
def __init__(self, data):
|
|
for key, value in data.items():
|
|
if isinstance(value, dict):
|
|
setattr(self, key, DictObject(value))
|
|
elif isinstance(value, list):
|
|
setattr(self, key, [
|
|
DictObject(item) if isinstance(item, dict) else item
|
|
for item in value
|
|
])
|
|
else:
|
|
setattr(self, key, value)
|
|
|
|
def __repr__(self):
|
|
"""打印对象时的表示形式"""
|
|
attrs = ', '.join(f"{key}={repr(value)}" for key, value in self.__dict__.items())
|
|
return f"{self.__class__.__name__}({attrs})"
|
|
|
|
def to_dict(self):
|
|
"""将对象转换回字典"""
|
|
result = {}
|
|
for key, value in self.__dict__.items():
|
|
if isinstance(value, DictObject):
|
|
result[key] = value.to_dict()
|
|
elif isinstance(value, list):
|
|
result[key] = [
|
|
item.to_dict() if isinstance(item, DictObject) else item
|
|
for item in value
|
|
]
|
|
else:
|
|
result[key] = value
|
|
return result
|
|
|
|
|
|
def json_to_object(json_data):
|
|
"""
|
|
将JSON数据转换为Python对象
|
|
|
|
Args:
|
|
json_data: JSON字符串或字典
|
|
|
|
Returns:
|
|
DictObject: 转换后的Python对象
|
|
"""
|
|
import json
|
|
|
|
# 如果输入是字符串,则解析为字典
|
|
if isinstance(json_data, str):
|
|
data = json.loads(json_data)
|
|
else:
|
|
data = json_data
|
|
|
|
# 转换为对象
|
|
return DictObject(data)
|
|
|
|
|
|
# 使用示例
|
|
if __name__ == "__main__":
|
|
# 示例JSON数据
|
|
example_json = {
|
|
"ret": 200,
|
|
"msg": "操作成功",
|
|
"data": {
|
|
"friends": [
|
|
"tmessage",
|
|
"medianote",
|
|
"qmessage",
|
|
"qqmail",
|
|
"wxid_910acevfm2nb21",
|
|
"qqsafe",
|
|
"wxid_9299552988412",
|
|
"weixin",
|
|
"exmail_tool",
|
|
"wxid_mp05xmje0ctn22",
|
|
"wxid_09oq4f4j4wg912",
|
|
"wxid_6bfguz79h8n122",
|
|
"wxid_lyuq4hr4lrjq22",
|
|
"wxid_a1zqyljsrsdu12",
|
|
"wxid_lv3pb3zhna3522",
|
|
"wxid_k2biq6fuinsr22",
|
|
"wxid_ujredjhxz9y712",
|
|
"wxid_uwb7989u0jea12",
|
|
"wxid_in46ey732vxu12",
|
|
"wxid_3rvervwohj6921",
|
|
"wxid_4wkls7tu62ua12",
|
|
"wxid_g0bdknnotx2f12",
|
|
"wxid_ce5fgp0icb3y21",
|
|
"wxid_1482424825211",
|
|
"wxid_vw3p4f6jy7bm12",
|
|
"wxid_o2m8xm71c23522",
|
|
"wxid_bclqpc2ho6o412",
|
|
"wxid_98pjjzpiisi721",
|
|
"wxid_noq2wsn5c8h222"
|
|
],
|
|
"chatrooms": [
|
|
"2180313478@chatroom",
|
|
"14358945067@chatroom",
|
|
"17362526147@chatroom",
|
|
"11685224357@chatroom",
|
|
"17522822550@chatroom"
|
|
],
|
|
"ghs": [
|
|
"gh_7aac992b0363",
|
|
"gh_d7293b5f14f4",
|
|
"gh_f51ce3ef83a4",
|
|
"gh_7d20df86e26b",
|
|
"gh_69bfb92a3e43"
|
|
]
|
|
}
|
|
}
|
|
|
|
# 转换为对象
|
|
obj = json_to_object(example_json)
|
|
|
|
# 通过属性访问
|
|
print(f"返回码: {obj.ret}")
|
|
print(f"消息: {obj.msg}")
|
|
print(f"好友数量: {len(obj.data.friends)}")
|
|
print(f"第一个好友: {obj.data.friends[0]}")
|
|
print(f"第一个群聊: {obj.data.chatrooms[0]}")
|
|
|
|
# 转换回字典
|
|
dict_data = obj.to_dict()
|
|
print(f"转换回字典: {dict_data}") |