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

处理嵌套JSON的NoneType TypeError及多地址拼接问题

解决多层嵌套JSON键缺失报错及多地址拼接问题

核心问题分析

原代码在嵌套键缺失时触发TypeError,是因为某一层get()返回None后,后续的下标[0]或get()操作无法在None对象上执行。同时需要实现多地址元素的字符串拼接需求。


解决方案

1. 安全提取嵌套值(避免键缺失报错)

对每一层嵌套都使用get()并设置默认值(空字典{}或空列表[]),确保后续操作不会因None对象报错。

2. 多地址拼接逻辑

当Address存在且为非空列表时,遍历提取每个元素的$值,用, 拼接成字符串;若Address不存在或为空列表,返回None。


完整代码示例

output = {
    "records": [
        {"ID":{"$":"123456"},"Records":{"ChildRecord":{"Address":[{"$": "24 Street"}]}}},
        {"ID":{"$":"456789"},"Records":{"ChildRecord":{}}},  # 缺失Address键的场景
        {"ID":{"$":"789012"},"Records":{"ChildRecord":{"Address":[{"$": "57 New Town"},{"$": "New Castle Road"},{"$": "PO Box 309"}]}}}  # 多地址场景
    ]
}

# 优化后的identifier提取(同时兼容ID缺失的情况)
identifier = [o.get('ID', {}).get('$') for o in output['records']]

# 处理地址的安全提取与拼接逻辑
address = []
for o in output['records']:
    # 逐层安全获取Address列表
    child_record = o.get('Records', {}).get('ChildRecord', {})
    address_list = child_record.get('Address', [])
    if address_list:
        # 提取所有地址的$值并拼接
        addr_str = ', '.join(item.get('$', '') for item in address_list)
        address.append(addr_str if addr_str else None)
    else:
        address.append(None)

print(identifier, 'identifier')
print(address, 'address')

输出结果

['123456', '456789', '789012'] identifier
['24 Street', None, '57 New Town, New Castle Road, PO Box 309'] address

简化写法(列表推导式版本)

如果偏好更简洁的写法,可将地址处理逻辑压缩为一行列表推导式:

address = [
    ', '.join(item.get('$', '') for item in addr_list) if addr_list else None
    for addr_list in [o.get('Records', {}).get('ChildRecord', {}).get('Address', []) for o in output['records']]
]

该写法与循环逻辑完全一致,仅可读性稍弱,按需选择即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:04