从带有重复键 Python 的字符串制作 dict/json

Sam*_*lla 1 python string json dictionary

我有一个可以解析为 json 或 dict 对象的字符串。我的字符串变量如下所示:

    my_string_variable = "{
                            "a":1,
                            "b":{
                                 "b1":1,
                                 "b2":2
                             },  
                            "b": { 
                                "b1":3, 
                                "b2":2,
                                "b4":8
                             } 
                           }"
Run Code Online (Sandbox Code Playgroud)

当我这样做时json.loads(my_string_variable),我有一个 dict 但只保留了键“b”的第二个值,这是正常的,因为 dict 不能包含重复的键。

拥有这样的 defaultdict 的最佳方法是什么:

    result = {
               'a':1,
               'b': [{'b1':1,'b2':2}, { 'b1':3, 'b2':2,'b4':8 } ]
             }
Run Code Online (Sandbox Code Playgroud)

我已经寻找过类似的问题,但它们都将字典或列表作为输入处理,然后创建 defaultdicts 来处理重复的键。

就我而言,我有一个字符串变量,我想知道是否有一种简单的方法可以实现这一点:)

谢谢^^

Kev*_*vin 6

可以做如下事情。

import json

def join_duplicate_keys(ordered_pairs):
    d = {}
    for k, v in ordered_pairs:
        if k in d:
           if type(d[k]) == list:
               d[k].append(v)
           else:
               newlist = []
               newlist.append(d[k])
               newlist.append(v)
               d[k] = newlist
        else:
           d[k] = v
    return d

raw_post_data = '{"a":1, "b":{"b1":1,"b2":2}, "b": { "b1":3, "b2":2,"b4":8} }'
newdict = json.loads(raw_post_data, object_pairs_hook=join_duplicate_keys)
print (newdict)
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码取决于值类型,if type(d[k]) == list. 因此,如果原始字符串本身给出了一个列表,那么可能需要进行一些错误处理才能使代码健壮。