Python:如何将非固定位置的JSON字段映射到字典
解决JSON中动态键值匹配的问题
你的核心问题是plist转成的JSON里,key数组的顺序不固定,对应的array或string值的位置也跟着变化,硬编码索引肯定行不通。我们可以通过建立键与对应值的映射字典来解决这个问题,这样不管键的顺序怎么变,都能通过键名直接找到对应的数据。
思路解析
plist转JSON的结构里,dict中的key数组和后续的所有值(不管是array元素还是单独的string)是按顺序一一对应的。比如key[0]对应第一个值,key[1]对应第二个值,以此类推。我们只需要:
- 提取所有
key组成列表; - 收集所有对应的值(展开数组类型的值,单个值直接保留)组成列表;
- 将两个列表配对成字典,这样就能用键名直接访问对应的值了。
完整解决方案代码
import json def get_plist_meta(element): """处理单个字段的值,返回格式化后的字符串""" if isinstance(element, dict): return element["string"] # 处理数组类型的字段(比如cast包含多个人员) return ", ".join(i["string"] for i in element) def build_meta_map(plist_dict): """构建key与对应值的映射字典""" keys = plist_dict['key'] values = [] # 遍历除key外的所有字段,收集所有值 for key, value in plist_dict.items(): if key == 'key': continue # 如果是数组,展开加入values;单个值直接加入 if isinstance(value, list): values.extend(value) else: values.append(value) # 校验键值数量是否匹配,避免数据异常 if len(keys) != len(values): raise ValueError(f"Keys count ({len(keys)}) doesn't match values count ({len(values)})") return dict(zip(keys, values)) # 示例使用 dump_json = '''{ "plist":{ "@version":"1.0", "dict":{ "key":[ "cast", "directors", "screenwriters", "studio" ], "array":[ { "dict":[ { "key":"name", "string":"Martina Piro" }, { "key":"name", "string":"Ralf Stark" } ] }, { "dict":{ "key":"name", "string":"Franco Camilio" } }, { "dict":{ "key":"name", "string":"Kai Meisner" } } ], "string":"Helix Films" } } }''' plist_metadata = json.loads(dump_json) meta_map = build_meta_map(plist_metadata['plist']['dict']) # 按需提取字段,顺序不再重要 if 'cast' in meta_map: print("Cast: ", get_plist_meta(meta_map['cast']['dict'])) if 'directors' in meta_map: print("Directors: ", get_plist_meta(meta_map['directors']['dict'])) if 'producers' in meta_map: print("Producers: ", get_plist_meta(meta_map['producers']['dict'])) if 'screenwriters' in meta_map: print("Screenwriters: ", get_plist_meta(meta_map['screenwriters']['dict'])) if 'studio' in meta_map: print("Studio: ", meta_map['studio'])
代码运行结果
对于你提供的示例JSON,运行后会输出:
Cast: Martina Piro, Ralf Stark Directors: Franco Camilio Screenwriters: Kai Meisner Studio: Helix Films
为什么这个方案有效?
不管key数组的顺序怎么变(比如producers跑到第一个位置,studio在中间),build_meta_map函数都会自动将每个key和它对应的正确值配对。你只需要通过键名(比如meta_map['producers'])就能拿到对应的数据,完全不用关心它在原JSON中的位置。
内容的提问来源于stack exchange,提问作者user16071428
相关产品推荐
相关产品推荐

