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中操作文件之seek()方法的使用教程
May 24 Python
python动态加载包的方法小结
Apr 18 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
python实现可视化动态CPU性能监控
Jun 21 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
Python中os模块的简单使用及重命名操作
Apr 17 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中for循环语句的几种变型
2006/11/26 PHP
解析php中反射的应用
2013/06/18 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php魔术变量用法实例详解
2014/11/13 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
使用Python对Excel进行读写操作
2017/03/30 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
python获取引用对象的个数方式
2019/12/20 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
laravel使用redis队列实例讲解
2021/03/23 PHP
军训自我鉴定100字
2014/02/13 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
酒店厨房管理制度
2015/08/06 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
python垃圾回收机制原理分析
2022/04/13 Python