python解析含有重复key的json方法


Posted in Python onJanuary 22, 2019

python自带的json包能够方便的解析json文本,但是如果json文本中包含重复key的时候,解析的结果就是错误的。如下为例

{"key":"1", "key":"2", "key":"3", "key2":"4"}

经过解析,结果却如下所示:

{
  "key":"3",
  "key2":"4"
}

原因是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]
    else:
      result[key]=val
  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方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析json实例方法
Nov 19 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
python 换位密码算法的实例详解
Jul 19 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
python中pygame安装过程(超级详细)
Aug 04 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
python+opencv边缘提取与各函数参数解析
Mar 09 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
Python设计模式之简单工厂模式实例详解
Jan 22 #Python
对python字典过滤条件的实例详解
Jan 22 #Python
python实现淘宝秒杀脚本
Jun 23 #Python
python实现网页自动签到功能
Jan 21 #Python
python实现桌面壁纸切换功能
Jan 21 #Python
在Python中通过getattr获取对象引用的方法
Jan 21 #Python
python实现windows壁纸定期更换功能
Jan 21 #Python
You might like
PHP脚本的10个技巧(6)
2006/10/09 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
php 学习资料零碎东西
2010/12/04 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python yield 小结和实例
2014/04/25 Python
python杀死一个线程的方法
2015/09/06 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python实战教程之自动扫雷
2018/07/13 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
大学生职业生涯规划书范文
2014/01/14 职场文书
边城读书笔记
2015/06/29 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
导游词之唐山景点
2019/12/18 职场文书
JavaScript ES6的函数拓展
2022/01/18 Javascript