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

如何将复杂JSON API响应映射为Python对象?类结构设计

嘿,针对你把复杂JSON API响应转成Python对象的需求,我整理了两种实用方案,还有对应的类结构设计思路,帮你轻松搞定这个问题:


一、简便的JSON到Python对象映射工具

推荐两个Python生态里的主流工具,专门处理嵌套JSON的对象转换,还能自动处理缺失字段、类型转换:

1. Pydantic(推荐生产环境使用)

Pydantic是功能强大的数据验证库,自带类型检查、自动类型转换(比如把JSON日期字符串转成Pythondate对象),对API场景非常友好,缺失字段会自动设为None或默认值。

先安装依赖:

pip install pydantic

2. Dataclasses + dataclasses_json(轻量方案)

如果你的项目不想引入太多依赖,Python标准库的dataclasses配合dataclasses_json扩展也能搞定,语法更简洁,适合快速开发。

安装依赖:

pip install dataclasses-json

二、理想的类结构设计

类结构完全镜像你的JSON响应层级,每个嵌套JSON对象对应一个Python类,同时处理好可选字段和列表类型:

用Pydantic实现的完整类结构

from pydantic import BaseModel, Field
from typing import List, Optional
from datetime import date

# 嵌套子模型:会计参考日期
class AccountingReferenceDate(BaseModel):
    day: Optional[int] = None
    month: Optional[int] = None

# 嵌套子模型:上一次账目信息
class LastAccounts(BaseModel):
    made_up_to: Optional[date] = None
    period_end_on: Optional[date] = None
    period_start_on: Optional[date] = None
    type: Optional[str] = None

# 嵌套子模型:下一次账目信息
class NextAccounts(BaseModel):
    due_on: Optional[date] = None
    overdue: Optional[bool] = None
    period_end_on: Optional[date] = None
    period_start_on: Optional[date] = None

# 账目总模型
class Accounts(BaseModel):
    accounting_reference_date: Optional[AccountingReferenceDate] = None
    last_accounts: Optional[LastAccounts] = None
    next_accounts: Optional[NextAccounts] = None
    next_due: Optional[date] = None
    next_made_up_to: Optional[date] = None
    overdue: Optional[bool] = None

# 年度申报模型
class AnnualReturn(BaseModel):
    last_made_up_to: Optional[date] = None
    next_due: Optional[date] = None
    next_made_up_to: Optional[date] = None
    overdue: Optional[bool] = None

# 分支公司详情模型
class BranchCompanyDetails(BaseModel):
    business_activity: Optional[str] = None
    parent_company_name: Optional[str] = None
    parent_company_number: Optional[str] = None

# 确认声明模型
class ConfirmationStatement(BaseModel):
    last_made_up_to: Optional[date] = None
    next_due: Optional[date] = None
    next_made_up_to: Optional[date] = None
    overdue: Optional[bool] = None

# 外国公司会计要求模型
class AccountingRequirement(BaseModel):
    foreign_account_type: Optional[str] = None
    terms_of_account_publication: Optional[str] = None

# 会计周期模型
class AccountPeriod(BaseModel):
    day: Optional[int] = None
    month: Optional[int] = None

# 提交期限模型
class MustFileWithin(BaseModel):
    months: Optional[int] = None

# 外国公司账目模型
class ForeignAccounts(BaseModel):
    account_period_from: Optional[AccountPeriod] = None
    account_period_to: Optional[AccountPeriod] = None
    must_file_within: Optional[MustFileWithin] = None

# 注册机构模型
class OriginatingRegistry(BaseModel):
    country: Optional[str] = None
    name: Optional[str] = None

# 外国公司详情模型
class ForeignCompanyDetails(BaseModel):
    accounting_requirement: Optional[AccountingRequirement] = None
    accounts: Optional[ForeignAccounts] = None
    business_activity: Optional[str] = None
    company_type: Optional[str] = None
    governed_by: Optional[str] = None
    is_a_credit_finance_institution: Optional[bool] = None
    originating_registry: Optional[OriginatingRegistry] = None
    registration_number: Optional[str] = None

# 链接模型
class Links(BaseModel):
    charges: Optional[str] = None
    filing_history: Optional[str] = None
    insolvency: Optional[str] = None
    officers: Optional[str] = None
    persons_with_significant_control: Optional[str] = None
    persons_with_significant_control_statements: Optional[str] = None
    registers: Optional[str] = None
    self: Optional[str] = None

# 曾用名模型
class PreviousCompanyName(BaseModel):
    ceased_on: Optional[date] = None
    effective_from: Optional[date] = None
    name: Optional[str] = None

# 注册地址模型
class RegisteredOfficeAddress(BaseModel):
    address_line_1: Optional[str] = None
    address_line_2: Optional[str] = None
    care_of: Optional[str] = None
    country: Optional[str] = None
    locality: Optional[str] = None
    po_box: Optional[str] = None
    postal_code: Optional[str] = None
    premises: Optional[str] = None
    region: Optional[str] = None

# 最外层公司模型
class Company(BaseModel):
    accounts: Optional[Accounts] = None
    annual_return: Optional[AnnualReturn] = None
    branch_company_details: Optional[BranchCompanyDetails] = None
    can_file: Optional[bool] = None
    company_name: Optional[str] = None
    company_number: Optional[str] = None
    company_status: Optional[str] = None
    company_status_detail: Optional[str] = None
    confirmation_statement: Optional[ConfirmationStatement] = None
    date_of_cessation: Optional[date] = None
    date_of_creation: Optional[date] = None
    etag: Optional[str] = None
    external_registration_number: Optional[str] = None
    foreign_company_details: Optional[ForeignCompanyDetails] = None
    has_been_liquidated: Optional[bool] = None
    has_charges: Optional[bool] = None
    has_insolvency_history: Optional[bool] = None
    is_community_interest_company: Optional[bool] = None
    jurisdiction: Optional[str] = None
    last_full_members_list_date: Optional[date] = None
    links: Optional[Links] = None
    partial_data_available: Optional[str] = None
    previous_company_names: List[PreviousCompanyName] = Field(default_factory=list)
    registered_office_address: Optional[RegisteredOfficeAddress] = None
    registered_office_is_in_dispute: Optional[bool] = None
    sic_codes: List[str] = Field(default_factory=list)
    subtype: Optional[str] = None
    type: Optional[str] = None
    undeliverable_registered_office_address: Optional[bool] = None

使用示例

import json

# 假设api_response是从接口获取的JSON字典
with open('company_data.json', 'r') as f:
    api_response = json.load(f)

# 转换为Python对象
company = Company(**api_response)

# 轻松访问属性
print(f"公司名称:{company.company_name}")
print(f"创建日期:{company.date_of_creation}")
if company.accounts and company.accounts.overdue:
    print("⚠️ 账目已逾期")
for old_name in company.previous_company_names:
    print(f"曾用名:{old_name.name}(生效日期:{old_name.effective_from})")

三、类结构设计的核心原则

  1. 镜像JSON层级:每个嵌套JSON对象对应一个独立类,结构和API响应完全对齐,可读性强
  2. 处理可选字段:所有字段设为Optional类型,默认值为None,避免因字段缺失报错
  3. 列表字段默认空列表:像previous_company_names这类列表,设置默认空列表,确保即使JSON中无此字段也能安全访问
  4. 严格类型匹配:对应JSON字段类型选择Python原生类型(比如日期用date,布尔值用bool),工具会自动完成类型转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:30:49