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

如何用列表推导式从JSON读取嵌套结构生成Person对象

问题:用列表推导式从JSON嵌套结构生成Person对象列表

JSON数据结构

"persons": [
    {
      "A": [
        {
          "type": "type1",
          "value": "",
          "is_valid": true
        },
        {
          "type": "type1",
          "value": "",
          "is_valid": true
        }
      ]
    },
    {
      "B": [
        {
          "type": "type2",
          "value": "",
          "is_valid": true
        }
      ]
    },
    {
      "C": [
        {
          "type": "type3",
          "value": "",
          "is_valid": true
        },
        {
          "type": "type3",
          "value": "",
          "is_valid": false
        }
      ]
    }
  ]

需求

读取persons字段,返回Person对象列表。Person类包含以下字段:

  • name: str
  • type: str
  • value: str
  • is_valid: bool

已实现的循环写法

def get_all() -> list[Person]:
    persons = []
    for p in config['persons']:
        for key, values in p.items():
            for value in values:
                persons.append(Person(type=value['type'], name=f'{key}', value='{}'.format(value['value']), is_valid=value['is_valid']))
    return persons

错误的列表推导式尝试

返回了嵌套列表,不符合需求:

return [[(k, v) for k, v in d.items()] for d in config['persons']]

正确的列表推导式写法

保持原循环的嵌套顺序,直接生成Person对象即可:

def get_all() -> list[Person]:
    return [
        Person(
            type=value['type'],
            name=key,
            value=str(value['value']),
            is_valid=value['is_valid']
        )
        for p in config['persons']
        for key, values in p.items()
        for value in values
    ]

说明

列表推导式的循环顺序和原嵌套循环完全一致:

  1. 遍历config['persons']中的每个元素p
  2. 遍历p中的键值对key, values
  3. 遍历values中的每个value
  4. 为每个value生成对应的Person对象

这样就能得到和原循环写法完全相同的Person对象列表,而非嵌套结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:20:27