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

Python json解析器允许重复键

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

Python json解析器允许重复键

您可以用

JSONDeprer.object_pairs_hook
来自定义
JSONDeprer
解码对象的方式。该挂钩函数将传递一个
(key,value)
通常会对其进行一些处理的成对列表,然后变成
dict

但是,由于Python字典不允许重复的键(而且您根本无法更改键),因此在

(key,value)
解码JSON时,可以在挂钩中保持不变地返回对,并获得对的嵌套列表:

from json import JSonDeprerdef parse_object_pairs(pairs):    return pairsdata = """{"foo": {"baz": 42}, "foo": 7}"""deprer = JSonDeprer(object_pairs_hook=parse_object_pairs)obj = deprer.depre(data)print obj

输出:

[(u'foo', [(u'baz', 42)]), (u'foo', 7)]

您如何使用此数据结构取决于您。如上所述,Python字典不允许重复的键,而且没有办法解决。您甚至将如何基于密钥进行查找?

dct[key]
会模棱两可。

因此,您既可以实现自己的逻辑来按期望的方式处理查找,也可以实现某种避免碰撞的功能,以使键(如果不是)变得唯一, 然后 从嵌套列表中创建字典。


编辑 :既然您说过要修改重复键以使其唯一,请按照以下步骤操作:

from collections import OrderedDictfrom json import JSonDeprerdef make_unique(key, dct):    counter = 0    unique_key = key    while unique_key in dct:        counter += 1        unique_key = '{}_{}'.format(key, counter)    return unique_keydef parse_object_pairs(pairs):    dct = OrderedDict()    for key, value in pairs:        if key in dct: key = make_unique(key, dct)        dct[key] = value    return dctdata = """{"foo": {"baz": 42, "baz": 77}, "foo": 7, "foo": 23}"""deprer = JSonDeprer(object_pairs_hook=parse_object_pairs)obj = deprer.depre(data)print obj

输出:

OrderedDict([(u'foo', OrderedDict([(u'baz', 42), ('baz_1', 77)])), ('foo_1', 7), ('foo_2', 23)])

make_unique
函数负责返回无冲突键。在这个例子中,它只是后缀与关键
_n
地方
n
是一个递增计数器-只是它适应您的需求。

由于

object_pairs_hook
完全按照JSON文档中出现的顺序接收对,因此也可以使用来保留该顺序
OrderedDict
,我也将其包括在内。



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

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

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