Python:如何从现有JSON对象提取指定元素构建新JSON对象
解决JSON提取元素时的TypeError问题
听起来你是在处理JSON数据精简时遇到了类型混淆的坑——那个TypeError: list indices must be integers or slices, not str报错,本质是你把列表(list)当成字典(dict)来用字符串索引了:列表只能用整数下标(比如list[0])或者切片来访问元素,而字典才是用字符串键(比如dict["key"])取值的。
我来给你一步步梳理正确的做法,结合你能单独访问元素的情况,应该能快速解决:
第一步:确认解析后的数据类型
先搞清楚你从JSON文件解析出来的到底是字典还是列表。可以先打印类型看看:
import json # 先读取并解析原始JSON with open("原始文件.json", "r", encoding="utf-8") as f: data = json.load(f) # 打印类型,确认是dict还是list print(type(data))
第二步:根据数据类型提取元素并构建新JSON
情况1:原始数据是字典(JSON对象,用{}包裹)
如果type(data)输出是<class 'dict'>,那直接提取需要的键值对就行:
# 定义你要保留的4个键 keys_to_keep = ["键1", "键2", "键3", "键4"] # 替换成你实际需要的键名 # 方法1:手动构建新字典 new_json = { "键1": data["键1"], "键2": data["键2"], "键3": data["键3"], "键4": data["键4"] } # 方法2:用字典推导式更简洁(推荐) new_json = {key: data[key] for key in keys_to_keep} # 写入新的JSON文件 with open("精简后的JSON.json", "w", encoding="utf-8") as f: json.dump(new_json, f, ensure_ascii=False, indent=4)
情况2:原始数据是列表(JSON数组,用[]包裹)
如果type(data)输出是<class 'list'>,说明原始JSON是一组对象的集合,你需要遍历每个对象再提取字段:
keys_to_keep = ["键1", "键2", "键3", "键4"] # 用列表推导式生成精简后的对象列表 new_json_list = [{key: item[key] for key in keys_to_keep} for item in data] # 写入文件 with open("精简后的JSON列表.json", "w", encoding="utf-8") as f: json.dump(new_json_list, f, ensure_ascii=False, indent=4)
排查你之前的错误
你之前报错,大概率是不小心把列表当成了字典来用。比如原始数据是列表,但你直接写了data["键名"]——这时候就会触发那个错误,因为列表只能用整数下标(比如data[0]["键名"]来访问第一个对象的字段)。
按上面的步骤来,应该能顺利生成你需要的精简JSON并写入文件啦!
内容的提问来源于stack exchange,提问作者Hugues
相关产品推荐
相关产品推荐

