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

Python:如何将非固定位置的JSON字段映射到字典

解决JSON中动态键值匹配的问题

你的核心问题是plist转成的JSON里,key数组的顺序不固定,对应的array或string值的位置也跟着变化,硬编码索引肯定行不通。我们可以通过建立键与对应值的映射字典来解决这个问题,这样不管键的顺序怎么变,都能通过键名直接找到对应的数据。

思路解析

plist转JSON的结构里,dict中的key数组和后续的所有值(不管是array元素还是单独的string)是按顺序一一对应的。比如key[0]对应第一个值,key[1]对应第二个值,以此类推。我们只需要:

  1. 提取所有key组成列表;
  2. 收集所有对应的值(展开数组类型的值,单个值直接保留)组成列表;
  3. 将两个列表配对成字典,这样就能用键名直接访问对应的值了。

完整解决方案代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:53:15