栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用python向JSON添加重复密钥

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用python向JSON添加重复密钥

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

另一方面,可以使 C* Python

json
模块对重复的密钥进行编码。这在 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}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391243.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号