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 抓取动态网页内容方案详解
Dec 25 Python
python常见的格式化输出小结
Dec 15 Python
Python面向对象编程基础解析(一)
Oct 26 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
python删除不需要的python文件方法
Apr 24 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
Selenium元素的常用操作方法分析
Aug 10 Python
详解numpy的argmax的具体使用
May 27 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
Python批量将csv文件转化成xml文件的实例
May 10 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中将网页导出为Word文档的代码
2012/05/25 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
express框架下使用session的方法
2019/07/31 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
详解Python中的多线程编程
2015/04/09 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
银行职业规划书范文
2013/12/28 职场文书
经典演讲稿范文
2013/12/30 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
财务出纳岗位职责
2014/02/03 职场文书
一年级班主任感言
2014/03/08 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
生日宴会祝酒词
2015/08/10 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书