有没有办法用python将重复键添加到json?
根据我的理解,你不能在python词典中有重复的键。通常,我如何创建json是创建字典然后json.dumps
。但是,我需要JSON中的重复密钥用于测试目的。但我不能这样做,因为我不能在python字典中添加重复的键。我试图在python 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"}