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 获取进程pid号的方法
Mar 10 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
基于python时间处理方法(详解)
Aug 14 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python查看模块,对象的函数方法
Oct 16 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
Python3如何对urllib和urllib2进行重构
Nov 25 Python
python加载自定义词典实例
Dec 06 Python
Python序列化pickle模块使用详解
Mar 05 Python
keras.utils.to_categorical和one hot格式解析
Jul 02 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
php开发文档 会员收费1期
2012/08/14 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
php json转换相关知识(小结)
2018/12/21 PHP
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
JS中的==运算: [''] == false —>true
2016/07/24 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
对python添加模块路径的三种方法总结
2018/10/16 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
pandas计数 value_counts()的使用
2019/06/24 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
PHP面试题附答案
2015/11/28 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
军训教官感言
2014/03/02 职场文书
幼师小班个人总结
2015/02/12 职场文书