如何修改JSON扁平化Python函数以支持嵌套列表结构?
嵌套JSON扁平化(支持含列表结构)
原有的flattenjson函数仅支持纯字典嵌套的JSON,处理包含列表的嵌套结构时会触发AttributeError(列表无keys属性),且无法解析列表内部的嵌套数据。
原函数代码:
def flattenjson(b, delim): val = {} for i in b.keys(): if isinstance(b[i], dict): get = flattenjson(b[i], delim) for j in get.keys(): val[i + delim + j] = get[j] else: val[i] = b[i] return val
修改后的函数(支持列表)
def flattenjson(b, delim): val = {} def flatten(item, prefix=''): if isinstance(item, dict): for key, value in item.items(): flatten(value, prefix + key + delim) elif isinstance(item, list): for idx, elem in enumerate(item): flatten(elem, prefix + str(idx) + delim) else: # 移除键末尾多余的分隔符 key = prefix[:-len(delim)] if prefix else str(item) val[key] = item flatten(b) return val
关键修改说明
- 新增列表类型判断,遍历列表时将索引作为键的一部分,保留元素的位置顺序
- 用内部递归函数
flatten统一处理字典、列表和普通值,简化逻辑结构 - 自动清理键末尾的冗余分隔符,避免生成
user.0.name.这类无效键
示例使用
假设输入带列表的JSON数据:
sample_json = { "user": { "name": "Alice", "orders": [ {"id": 1, "product": "Laptop"}, {"id": 2, "product": "Phone"} ] } }
调用flattenjson(sample_json, '.')后得到的扁平化结果:
{ "user.name": "Alice", "user.orders.0.id": 1, "user.orders.0.product": "Laptop", "user.orders.1.id": 2, "user.orders.1.product": "Phone" }
内容的提问来源于stack exchange,提问作者Alisher Azizov
相关产品推荐
相关产品推荐

