使用python向JSON添加重复键

发布于 2021-01-29 15:01:51

有没有办法用python向json添加重复键?

根据我的理解,python词典中不能有重复的键。通常,创建json的方法是先创建字典,然后创建json.dumps。但是,出于测试目的,我需要在JSON中使用重复的键。但是我不能这样做,因为我不能在python字典中添加重复的键。我正在尝试在python
3中做到这一点

关注者
0
被浏览
58
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您总是可以手动构造这样的字符串值。

    另一方面,可以使 C* Pythonjson模块对重复的密钥进行编码。这在 Python 2中 非常
    棘手,因为模块根本不尊重鸭子类型。
    *json

    直截了当的解决方案是从collections.Mapping-继承,因为 不是JSON可序列化的” ,所以您不能这样做
    MyMapping

    下一类尝试将a子类化dict-很好,但是如果json.dumps注意到类型为dict,它会从调用中跳过__len__,并dict直接看到基础-
    如果为空,{}则直接输出,因此很明显,如果我们伪造方法,则基础字典一定不能是空的。

    喜悦的下一个来源是实际__iter__被调用,它会迭代密钥。并为每个键__getitem__调用,因此我们需要记住给定键返回的对应值是什么…因此,我们得出了一个非常丑陋的Python
    2解决方案:

    import json
    class FakeDict(dict):
        def __init__(self, items):
            # need to have something in the dictionary
            self['something'] = 'something'
            self.items = items
    
        def __getitem__(self, key):
            return self.last_val
    
        def __iter__(self):
            subiter = iter(self.items)
            def generator():
                for key, value in self.items:
                    self.last_val = value
                    yield key
    
            return generator()
    
    print json.dumps(FakeDict([('a', 5), ('a', 6)]), sort_keys=False)
    

    在CPython
    3.3+中,它稍微容易些……不,collections.abc.Mapping不起作用,是的,您需要将a子类化dict,是的,您需要假冒您的字典包含内容…但是内部JSON编码器调用items而不是__iter__and
    __getitem__

    因此在Python 3上:

    import json
    
    class FakeDict(dict):
        def __init__(self, items):
            self['something'] = 'something'
            self._items = items
        def items(self):
            return self._items
    
    print(json.dumps(FakeDict([('a', 1), ('a', 2)])))
    

    打印出来

    {"a": 1, "a": 2}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看