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学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
Django 前后台的数据传递的方法
Aug 08 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
python处理document文档保留原样式
Sep 23 Python
python中for循环变量作用域及用法详解
Nov 05 Python
django实现日志按日期分割
May 21 Python
使用python实现名片管理系统
Jun 18 Python
python中setuptools的作用是什么
Jun 19 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
python 实现mysql自动增删分区的方法
Apr 01 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
将数组写入txt文件 var_export
2009/04/21 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python生成密码库功能示例
2017/05/23 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
Python实现k-means算法
2018/02/23 Python
使用python爬取B站千万级数据
2018/06/08 Python
django自带调试服务器的使用详解
2019/08/29 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
linux面试题参考答案(6)
2014/08/29 面试题
木工主管岗位职责
2013/12/08 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
学生会主席事迹材料
2014/01/28 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
初二学生评语大全
2014/12/26 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书