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脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
详解Python当中的字符串和编码
Apr 25 Python
Python编程之序列操作实例详解
Jul 22 Python
python读取excel表格生成erlang数据
Aug 26 Python
python实现拓扑排序的基本教程
Mar 11 Python
opencv python 图像去噪的实现方法
Aug 31 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
Python 机器学习工具包SKlearn的安装与使用
May 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脚本
2006/11/26 PHP
php 团购折扣计算公式
2011/11/24 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
python进程与线程小结实例分析
2018/11/11 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
python函数的作用域及关键字详解
2019/08/20 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
python向图片里添加文字
2019/11/26 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
中海讯通笔试题
2015/09/15 面试题
海飞丝的广告词
2014/03/20 职场文书
赔偿协议书范本
2014/04/15 职场文书
青春奉献演讲稿
2014/05/08 职场文书
三八活动策划方案
2014/08/17 职场文书
先进工作者个人总结
2015/02/15 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python