构建Python SDK:如何自动/半自动映射嵌套JSON为Python类?
问题描述
需要处理多条嵌套结构的JSON消息,构建Python SDK时需将每个JSON结构映射为一组嵌套的Python类(基于Pydantic),手动实现过程繁琐,询问是否存在自动/半自动的实现方式。
示例JSON消息
{ "GlobalGnbId": { "PlmnIdentity": { "Data": [ 19, 241, 132 ] }, "GnbId": { "Value": 1, "Length": 22 } }, "OptionalGnbDuId": 1 }
手动编写的对应Pydantic类
class PlmnIdentity(BaseModel): """Class for PLMN identity""" Data: list[int] class GnbId(BaseModel): """Class for gNodeB ID""" Value: int Length: int class GlobalGnbId(BaseModel): """Class for global gNodeB ID""" PlmnIdentity: PlmnIdentity GnbId: GnbId class NodeId(BaseModel): """Class for node ID""" GlobalGnbId: GlobalGnbId OptionalGnbDuId: int
完整最小化示例
from pydantic import BaseModel, TypeAdapter import json class PlmnIdentity(BaseModel): """Class for PLMN identity""" Data: list[int] class GnbId(BaseModel): """Class for gNodeB ID""" Value: int Length: int class GlobalGnbId(BaseModel): """Class for global gNodeB ID""" PlmnIdentity: PlmnIdentity GnbId: GnbId class NodeId(BaseModel): """Class for node ID""" GlobalGnbId: GlobalGnbId OptionalGnbDuId: int node_id_str = \ """ { "GlobalGnbId": { "PlmnIdentity": { "Data": [ 19, 241, 132 ] }, "GnbId": { "Value": 1, "Length": 22 } }, "OptionalGnbDuId": 1 } """ # 解析为Pydantic实例 node_id_class = TypeAdapter(NodeId).validate_json(node_id_str) print(node_id_class) print(node_id_class.GlobalGnbId.PlmnIdentity.Data) print(node_id_class.OptionalGnbDuId) # 转换为字典 node_id_dict = node_id_class.model_dump() print(node_id_dict)
解决方案
以下是几种自动/半自动生成嵌套Pydantic类的方法:
1. 使用datamodel-code-generator(全自动)
这是最常用的工具,可直接从JSON文件或字符串生成符合要求的Pydantic模型代码,支持嵌套结构、类型推断和基础注释生成。
步骤:
- 安装工具:
pip install datamodel-code-generator
- 从JSON文件生成模型:
将示例JSON保存为node_id.json,执行命令:
datamodel-codegen --input node_id.json --output node_id_models.py
- 从JSON字符串生成模型:
echo '{"GlobalGnbId": {"PlmnIdentity": {"Data": [19,241,132]}, "GnbId": {"Value":1,"Length":22}}, "OptionalGnbDuId":1}' | datamodel-codegen --input - --output node_id_models.py
生成的代码会自动创建嵌套类,结构与手动编写的一致,同时自动添加类型注解。
2. Pydantic动态生成模型(运行时半自动)
如果不需要生成物理代码文件,而是在运行时动态创建嵌套模型,可使用Pydantic的create_model函数递归处理JSON结构:
from pydantic import create_model, BaseModel import json node_id_str = """ { "GlobalGnbId": { "PlmnIdentity": { "Data": [19,241,132] }, "GnbId": {"Value":1,"Length":22} }, "OptionalGnbDuId":1 } """ # 递归创建嵌套模型 def create_nested_model(model_name: str, data: dict) -> type[BaseModel]: fields = {} for field_name, field_value in data.items(): if isinstance(field_value, dict): # 递归生成子模型 sub_model = create_nested_model(f"{model_name}{field_name.capitalize()}", field_value) fields[field_name] = (sub_model, ...) elif isinstance(field_value, list): # 推断列表元素类型(若列表非空) elem_type = type(field_value[0]) if field_value else list fields[field_name] = (list[elem_type], ...) else: fields[field_name] = (type(field_value), ...) return create_model(model_name, **fields) # 生成根模型 NodeId = create_nested_model("NodeId", json.loads(node_id_str)) # 使用模型解析JSON from pydantic import TypeAdapter node_instance = TypeAdapter(NodeId).validate_json(node_id_str) print(node_instance.GlobalGnbId.PlmnIdentity.Data)
3. Pydantic v2 CLI生成(半自动)
Pydantic v2自带CLI工具,可从JSON Schema生成模型。若已有JSON示例,可先将其转换为JSON Schema,再使用CLI生成:
步骤:
- 将JSON转换为JSON Schema(可通过代码或在线工具实现)
- 执行CLI命令:
pydantic generate --schema schema.json --output models.py
内容的提问来源于stack exchange,提问作者mabalenk
相关产品推荐
相关产品推荐

