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 urlopen 使用小示例
Sep 06 Python
python使用新浪微博api上传图片到微博示例
Jan 10 Python
关于Python数据结构中字典的心得
Dec 04 Python
Python操作MySQL模拟银行转账
Mar 12 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
对python添加模块路径的三种方法总结
Oct 16 Python
Django处理多用户类型的方法介绍
May 18 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 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五种设计模式小结
2011/03/23 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
13个PHP函数超实用
2015/10/21 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python部署web开发程序的几种方法
2017/05/05 Python
Python 多进程和数据传递的理解
2017/10/09 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
酒店前厅员工辞职信
2014/01/08 职场文书
项目计划书范文
2014/01/09 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
销售岗位职责范本
2014/06/12 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
万能检讨书
2015/01/27 职场文书
旅游项目合作意向书
2015/05/08 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript