python键不能重复_Python json解析器允许重复键

您可以使用JSONDecoder.object_pairs_hook来自定义JSONDecoder如何解码对象.这个钩子函数将传递一个(键,值)对的列表,你通常会对它们进行一些处理,然后变成一个dict.

但是,由于Python词典不允许重复键(并且您根本无法更改它),因此您可以在钩子中返回未更改的对,并在解码JSON时获取(键,值)对的嵌套列表:

from json import JSONDecoder

def parse_object_pairs(pairs):

return pairs

data = """

{"foo": {"baz": 42}, "foo": 7}

"""

decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)

obj = decoder.decode(data)

print obj

输出:

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

您如何使用此数据结构取决于您.如上所述,Python词典不允许重复键,并且没有办法解决这个问题.你怎么会基于一个键进行查找? dct [key]会模棱两可.

因此,您可以实现自己的逻辑来按照预期的方式处理查找,或者实现某种类型的冲突避免,以便在不存在时使密钥唯一,然后从嵌套列表中创建字典.

编辑:既然你说你想修改重复键以使其独特,那么你就是这样做的:

from collections import OrderedDict

from json import JSONDecoder

def make_unique(key, dct):

counter = 0

unique_key = key

while unique_key in dct:

counter += 1

unique_key = '{}_{}'.format(key, counter)

return unique_key

def parse_object_pairs(pairs):

dct = OrderedDict()

for key, value in pairs:

if key in dct:

key = make_unique(key, dct)

dct[key] = value

return dct

data = """

{"foo": {"baz": 42, "baz": 77}, "foo": 7, "foo": 23}

"""

decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)

obj = decoder.decode(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保留该顺序,我也包括它.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值