处理嵌套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-
相关产品推荐
相关产品推荐

