You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建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生成:

步骤:

  1. 将JSON转换为JSON Schema(可通过代码或在线工具实现)
  2. 执行CLI命令:
pydantic generate --schema schema.json --output models.py

内容的提问来源于stack exchange,提问作者mabalenk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:40:00