Python—如何将非顺序JSON字段分配/映射到dict

Python—如何将非顺序JSON字段分配/映射到dict,python,json,mapping,Python,Json,Mapping,我有一个JSON,其中包含一个不总是存在的键的dict,至少不是所有键都在同一位置。例如,“producers”并不总是在数组dict[2]上,或者“directors”不总是在JSON的[1]上,这完全取决于我传递到函数中的JSON。根据['plist']['dict']['key']上的可用内容,内容映射到dict 0,1,2,3(studio除外) 我如何才能找到演员、导演、制片人等的对应数组,因为他们并不总是位于同一个数组编号?! 最后,我总是希望能够为正确的字段提取正确的数据,即使['

我有一个JSON,其中包含一个不总是存在的键的dict,至少不是所有键都在同一位置。例如,“producers”并不总是在数组dict[2]上,或者“directors”不总是在JSON的[1]上,这完全取决于我传递到函数中的JSON。根据['plist']['dict']['key']上的可用内容,内容映射到dict 0,1,2,3(studio除外)

我如何才能找到演员、导演、制片人等的对应数组,因为他们并不总是位于同一个数组编号?! 最后,我总是希望能够为正确的字段提取正确的数据,即使['plist']['dict']['key']有时可能会根据映射的dict而变化

...
def get_plist_meta(element):
    if isinstance(element, dict):
        return element["string"]
    return ", ".join(i["string"] for i in element)

...
### Default map if all fields are present
# 0 = cast
# 1 = directors
# 2 = producers
# 3 = screenwriters
plist_metadata = json.loads(dump_json)
### make fields match the given sequence 0 = cast, 1 = directors etc. ()
if 'cast' in plist_metadata['plist']['dict']['key']:
    print("Cast: ", get_plist_meta(plist_metadata['plist']['dict']['array'][0]['dict']))
if 'directors' in plist_metadata['plist']['dict']['key']:
    print("Directors: ", get_plist_meta(plist_metadata['plist']['dict']['array'][1]['dict']))
if 'producers' in plist_metadata['plist']['dict']['key']:
    print("Producers: ", get_plist_meta(plist_metadata['plist']['dict']['array'][2]['dict']))
if 'screenwriters' in plist_metadata['plist']['dict']['key']:
    print("Screenwriters: ", get_plist_meta(plist_metadata['plist']['dict']['array'][3]['dict']))
if 'studio' in plist_metadata['plist']['dict']['key']:
    print("Studio: ", plist_metadata['plist']['dict']['string'])
JSON:

JSON也可以在这里获得:


提前感谢

我认为这解决了您的问题:

导入json
dump_json=“”{plist:{@version:{1.0”,“dict:{“key”:[“cast”,“directors”,“screenswriters”,“studio”],“array:{“dict:[{”key:“name”,“string:“Martina Piro”},{“key:”name”,“string:“Ralf Stark”},{“dict:{“key:”name”,“string:“Franco Camilio”},{“dict:{”key:{“key:”name”,“string:“Kai:”Meisner”},{“string:“Helix电影”}
plist_metadata=json.loads(dump_json)
角色=[‘演员’、‘导演’、‘制片人’、‘编剧’]#所有角色
名称={'cast':[],'directors':[],'producers':[],'screenswriters':[]}存储最终输出
j=0#统计我们在plist_元数据['plist']['dict']['array']中查看的数组项
对于names.keys()中的x:#遍历所有可能的角色
如果plist_元数据中的x['plist']['dict']['key']:#如果键中存在角色,我们将其存储在names[role_name]中
y=plist_元数据['plist']['dict']['array'][j]['dict']#跟踪值
如果是实例(plist#u元数据['plist']['dict']['array'][j]['dict'],dict):#如果是dict,则将其封装在列表中
y=[plist_元数据['plist']['dict']['array'][j]['dict']]
j+=1#添加到plist dict数组索引中
名称[x]=列表(映射(lambda x:x['string'],y))#将每个条目从{“key”:“name”,“string”:“Martina Piro”}映射到“Martina Piro”
打印(姓名)
def列表名称(角色名称):
如果角色名称不在names.keys()中:
返回f'无效的列表请求:未找到角色名称“{Role\u name}'
返回f'{role_name.capitalize()}:{,“.join(names[role_name])}”
打印(列出名称('cast'))
打印(列出听众姓名)
输出:

{'cast':['Martina Piro','Ralf Stark'],'directors':['Franco Camilio'],'producer':[],'screenswriters':['Kai Meisner']}
演员:玛蒂娜·皮罗,拉尔夫·斯塔克
无效的列表请求:未找到角色名称“访问者”。
如果您更喜欢其他解决方案,请尝试以下方法:

# We will use this function to extract the names from the subdicts. We put single items in a new array so the result is consistent, no matter how many names there were.
def get_names(name_dict):
    arrayfied = name_dict if isinstance(name_dict, list) else [name_dict]
    return [o["string"] for o in arrayfied]

# Make a list of tuples
dict = plist_metadata['plist']['dict']
zipped = zip(dict["key"], dict["array"])

# Get the names from the subdicts and put it into a new dict
result = {k: get_names(v["dict"]) for k, v in zipped}
这会给你一个新的口述,看起来像这样

{'cast': ['Martina Piro', 'Ralf Stark'], 'directors': ['Franco Camilio'], 'screenwriters': ['Kai Meisner']}
新的dict将只包含原始dict中的密钥


我建议您查看一下
zip
map
以及。

请确保在您的帖子以及外部链接中包含示例数据。你在哪里使用“present_roles”?我删除了它,谢谢@kaydededunlop。我需要一些我在问题中已经展示过的东西(打印(“Cast:”,get_plist_meta(plist_metadata['plist']['dict']['array'][0]['dict']))每个键(Cast,producer等)的逗号分隔列表将非常棒。如前所述,我必须将此文件写入数据库中,以添加该文件。如果还有什么需要改变的,请再评论一下。太棒了,非常感谢你,你救了我一天
{'cast': ['Martina Piro', 'Ralf Stark'], 'directors': ['Franco Camilio'], 'screenwriters': ['Kai Meisner']}