使用python将重复键添加到JSON

时间:2015-04-08 16:09:30

标签: python json python-3.x

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

根据我的理解,你不能在python词典中有重复的键。通常,我如何创建json是创建字典然后json.dumps。但是,我需要JSON中的重复密钥用于测试目的。但我不能这样做,因为我不能在python字典中添加重复的键。我试图在python 3中这样做

3 个答案:

答案 0 :(得分:3)

你总是可以手工构建这样的字符串值。

另一方面,可以使 C Python json模块对重复键进行编码。这在 Python 2 非常棘手,因为json模块根本不尊重duck-typing。

直接的解决方案是继承collections.Mapping - 你不能,因为MyMapping不是JSON可序列化的。”

下一个尝试将dict子类化 - 好吧,但如果json.dumps注意到该类型为dict,则会从调用__len__跳过,并看到基础{直接{1}} - 如果它为空,则直接输出dict,所以如果我们伪造方法,则基本字典不能为空。

下一个欢乐的来源是实际调用{},它会迭代键;并且对于每个键,调用__iter__,因此我们需要记住为给定键返回的相应值是什么...因此我们得到了一个非常难看的Python 2解决方案:

__getitem__

在CPython 3.3+中它稍微容易一点......不,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) 不起作用,是的,你需要子类collections.abc.Mapping,是的,你需要伪造你的字典有内容。 ..但内部JSON编码器调用dict而不是items__iter__

因此在Python 3上:

__getitem__

打印出来

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)])))

答案 1 :(得分:1)

非常感谢 Antti Haapala,我发现您甚至可以使用它将元组数组转换为 FakeDict:

def function():
    array_of_tuples = []
    array_of_tuples.append(("key","value1"))
    array_of_tuples.append(("key","value2"))
    return FakeDict(array_of_tuples)

print(json.dumps(function()))

输出:

{"key": "value1", "key": "value2"}

答案 2 :(得分:-1)

实际上,这很容易:

$> python -c "import json; print json.dumps({1: 'a', '1': 'b'})"
{"1": "b", "1": "a"}