Python中使用JSON

news/2025/3/11 14:27:54/文章来源:https://www.cnblogs.com/krockey/p/18764992

Python处理JSON数据,原有的JSON不支持别名,扩展一下

from dataclasses import asdict, is_dataclass
from enum import Enum
import json
from datetime import datetime
from typing import TypeVar, Type, Optional, Anyfrom model.ConstInfo import ConstInfoT = TypeVar('T')class JsonUtil:@staticmethoddef to_json(obj: object) -> Optional[str]:"""对象转JSON字符串:param obj:需要序列化的对象:return: JSON字符串(失败返回None)"""try:if hasattr(obj, 'to_dict'):data = obj.to_dict()else:data = obj.__dict__return json.dumps(data,default=JsonUtil._serialize,ensure_ascii=False)except Exception as e:print(e)return None@staticmethoddef parse_json(json_str: str, obj_type: Type[T]) -> Optional[T]:"""Json字符串解析:param json_str: Json字符串:param obj_type: 解析对象类型:return: 解析对象"""try:raw_data: dict[str, Any] = json.loads(json_str)if hasattr(obj_type, 'from_dict'):return obj_type.from_dict(raw_data)#  处理普通类init_data = {key.replace(' ', '_'): valuefor key, value in raw_data.items()}return obj_type(**init_data)except Exception as e:print(e)return None@staticmethoddef _serialize(o: Any) -> Any:"""自定义序列化逻辑"""# 处理datetimeif isinstance(o, datetime):return o.strftime('%Y-%m-%d %H:%M:%S')# 处理枚举类型if isinstance(o, Enum):return o.value# 处理dataclass对象if is_dataclass(o):return asdict(o)# 处理自定义to_dict方法的对象if hasattr(o, 'to_dict'):return o.to_dict()# 其他对象尝试使用 __dict__if hasattr(o, '__dict__'):return vars(o)# 兜底处理return str(o)

处理JSON映射:

from dataclasses import dataclass, asdict, fields, is_dataclass
from typing import Any, Dict, Type, get_args, get_type_hintsdef field_mapper(mapping: Dict[str, str]):def decorator(cls):# 序列化逻辑def to_dict(self):# 递归处理嵌套对象def _convert(value):if hasattr(value, 'to_dict'):return value.to_dict()elif isinstance(value, list):return [_convert(v) for v in value]elif isinstance(value, dict):return {k: _convert(v) for k, v in value.items()}else:return value# 获取原始数据并递归转换raw_data = {field.name: getattr(self, field.name)for field in fields(self)}converted_data = {k: _convert(v) for k, v in raw_data.items()}# 应用字段名映射return {mapping.get(k, k): v for k, v in converted_data.items()}"""这是一段字典推导式结构:{key_expression:value_expression for item in iterable}for k,v in data.items():遍历字典mapping.get(k, k):如果字典中存在k,则返回对应的值,否则返回k本身            """# 反序列化逻辑@classmethoddef from_dict(cls, data: Dict[str, Any]):reverse_mapping = {v: k for k, v in mapping.items()}remapped_data = {}for json_key, value in data.items():# 反向映射字段名cls_key = reverse_mapping.get(json_key, json_key)# 获取字段类型提示field_type = get_type_hints(cls).get(cls_key, Any)# 递归处理嵌套对象remapped_data[cls_key] = _convert_value(value, field_type)return cls(**remapped_data)def _convert_value(value: Any, target_type: Type):# 处理嵌套对象(如 RuleInfo)if is_dataclass(target_type) and hasattr(target_type, 'from_dict') and isinstance(value, dict):return target_type.from_dict(value)# 处理列表中的对象(如 List[RuleInfo])elif isinstance(value, list):# 获取列表元素的类型(例如 List[RuleInfo] -> RuleInfo)item_type = get_args(target_type)[0] if get_args(target_type) else Anyreturn [_convert_value(item, item_type) for item in value]# 其他类型直接返回else:return valuecls.to_dict = to_dictcls.from_dict = from_dictreturn clsreturn decorator

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897259.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫

目录什么是 Selenium环境搭建与配置安装 Selenium下载浏览器驱动基础操作启动浏览器并访问网页定位网页元素通过 ID 定位通过 CSS 选择器定位通过 XPath 定位与元素交互提取数据交互操作设置等待时间切换页面执行 JavaScript 代码关闭浏览器进阶技巧使用 ActionChains 模拟用户…

DCDC电源模块

车载直流电源DCDC电源模块是一种电力电子设备,它能够在电动汽车或混动汽车的电气系统中,实现直流电源电压之间的升降转换,从而确保低压电电气系统在车辆运行过程中获得稳定且适当的电源供应。 车载直流电源DCDC电源模块是一种电力电子设备,它能够在电动汽车或混动汽车…

SpringSecurity5(1-快速入门)

Spring Security提供了简单而强大的安全机制,支持身份验证和授权。基本使用包括在Spring Boot应用中引入Spring Security依赖,配置HTTP安全规则,定义用户角色和权限。通过使用内存用户存储或集成数据库,可以实现基于表单登录、HTTP基本认证等多种认证方式,确保应用程序的安…

ASE9N20-ASEMI工业自动化专用ASE9N20

ASE9N20-ASEMI工业自动化专用ASE9N20编辑:ll 一、性能卓越,能效先锋 9N20 MOS 管最为人称道的便是它超低的导通电阻。在电路中,犹如为电流开辟了一条 “高速公路”,让电能得以高效传输,极大减少了因电阻产生的热损耗。这意味着无论是为便携设备供电的 DC - DC 转换器,还是…

LayerSkip: 使用自推测解码加速大模型推理

自推测解码是一种新颖的文本生成方法,它结合了推测解码 (Speculative Decoding) 的优势和大语言模型 (LLM) 的提前退出 (Early Exit) 机制。该方法出自论文 LayerSkip: Enabling Early-Exit Inference and Self-Speculative Decoding。它通过使用 同一个模型 的早期层来生成候…

2025年我用 Compose 写了一个 Todo App

标题党嫌疑犯实锤 序言 从2月12日到3月4日这整整三周时间里,我从零开始又学习了一次 Compose。 为什么说又,是因为这已经是我第二次学习这套课程了。 故事从 4 年前说起,2021 年在意外获悉扔物线朱凯老师准备发布一套名为 Compose 的新课程,意识到这是 Android 未来的方向,…

Ubuntu设置静态IP——NetworkManager方式

1、直接在系统界面上设置静态IP的方式,不再赘述 2、命令行方式查看已经有哪些工具#查看状态 sudo systemctl status Netplan sudo systemctl status NetworkManager sudo systemctl status systemd-networkd sudo systemctl status NetworkManager出现Active,说明电脑已经安装…

《Quick Start Kubernetes》读后感

一、 为什么选择这本书? 面试的时候经常被问到 kubernetes(下称 k8s),所以打算学习 k8s。看到《Quick Start Kubernetes》的作者对自己所写的书持续地更新,被这种认真打动了,外加这本书只有100多页,所以选择了这本书作为入门 k8s 的教材。 二、这本书写了什么? 这本书介绍…

正交实验法python实现

1.等水平正交表 每个条件下的种类一样多 例1: 这是一个7因子2状态 列表里内部每一个[]表示一个因子,然后每个因子都有2种类型 #7因子2状态 from allpairspy import AllPairs parameters = [["Chrome", "Firefox"],#因子1有"Chrome"或"Fir…