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冒泡排序注意要点实例详解
Sep 09 Python
python正则表达式的使用
Jun 12 Python
python实现k-means聚类算法
Feb 23 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
pytorch标签转onehot形式实例
Jan 02 Python
python各层级目录下import方法代码实例
Jan 20 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 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数据对象映射模式实例分析
2019/03/29 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
WordPress JQuery处理沙发头像
2009/06/22 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
jQuery Mobile页面返回不需要重新get
2016/04/26 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Django学习笔记之Class-Based-View
2017/02/15 Python
python列表的增删改查实例代码
2018/01/30 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python使用建议与技巧分享(二)
2020/08/17 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
英语专业推荐信
2013/11/16 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
市场总监岗位职责
2015/02/11 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
Python函数对象与闭包函数
2022/04/13 Python
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android