python解析含有重复key的json⽅法
python⾃带的json包能够⽅便的解析json⽂本,但是如果json⽂本中包含重复key的时候,解析的结果就是错误的。如下为例 {"key":"1", "key":"2", "key":"3", "key2":"4"}
霹雳布袋戏佛门人物经过解析,结果却如下所⽰:
{
"key":"3",
"key2":"4"
}最好it培训学校
原因是python解析的时候是创建⼀个字典,⾸先会读取到key的值,但是后⾯遇到重复键的时候,后来的值会覆盖原来的值,导致最后只有⼀个key的值留下来。
这肯定不是我们想要的结果,其中⼀种结果可以是将相同键的值聚合成⼀个数组,即如下所⽰。
利用数组公式{
"key":["1","2","3"],
"key2":"4"
}
如何得到这种结果呢?python的json包还是留下了活路的。⾸先来看⼀下解析函数loads的原型。
json.loads(s, encoding=None, cls=None,
object_hook=None, parse_float=None,
parse_int=None, parse_constant=None,
object_pairs_hook=None, **kw)
要注意的是object_pairs_hook这个参数,这是个回调函数,在解析json⽂本的时候会调⽤它并更改返回的结果。为了得到前述的结果,我们定义如下的hook函数:
def my_obj_pairs_hook(lst):
result={}
count={}
for key,val in lst:
if key in count:count[key]=1+count[key]
else:count[key]=1
if key in result:
if count[key] > 2:
result[key].append(val)
else:
result[key]=[result[key], val]
用什么编辑xml文件方便
else:python解析json文件
result[key]=valspringsecurity登录认证
return result
在解析⽂本的时候将上述函数作为参数传⼊,代码如下所⽰:
json.loads(data, object_pairs_hook=my_obj_pairs_hook)
即可得到前述的相同键的值合并为数组的结果。
在这个⽰例中,传⼊my_obj_pairs_hook的参数是⼀个元组列表,⼤致如下所⽰:
[("key","1"),("key","2"),("key","3"),("key2","4")]
之所以参数是这个样⼦,是因为这⼏个键值对组成了⼀个字典,python使⽤默认的dict⽅法返回字典,⾃然会出现值覆盖的情况。⽽有了my_obj_pairs_hook之后就调⽤这个函数得到字典结果,这样我们就保证了键值的不丢失,最终得到我们希望的结果。如果是个更加复杂的json⽂本,则每次解析⼀个字典的时候都会调⽤这个函数,也会传⼊不同的元组列表,⼤致如⽰例所⽰。
以上这篇python解析含有重复key的json⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。