您总是可以手动构造这样的字符串值。
另一方面,可以使 C* Pythonjson
模块对重复的密钥进行编码。这在 Python 2中 非常
棘手,因为模块根本不尊重鸭子类型。 *
json
直截了当的解决方案是从
collections.Mapping-继承,因为 “ 不是JSON可序列化的” ,所以您不能这样做 。
MyMapping
下一类尝试将a子类化
dict-很好,但是如果
json.dumps注意到类型为
dict,它会从调用中跳过
__len__,并
dict直接看到基础-
如果为空,
{}则直接输出,因此很明显,如果我们伪造方法,则基础字典一定不能是空的。
喜悦的下一个来源是实际
__iter__被调用,它会迭代密钥。并为每个键
__getitem__调用,因此我们需要记住给定键返回的对应值是什么…因此,我们得出了一个非常丑陋的Python
2解决方案:
import jsonclass 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 jsonclass FakeDict(dict): def __init__(self, items): self['something'] = 'something' self._items = items def items(self): return self._itemsprint(json.dumps(FakeDict([('a', 1), ('a', 2)])))
打印出来
{"a": 1, "a": 2}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)