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 相关文章推荐
web.py在模板中输出美元符号的方法
Aug 26 Python
python字典基本操作实例分析
Jul 11 Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 Python
python僵尸进程产生的原因
Jul 21 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
django 在原有表格添加或删除字段的实例
May 27 Python
django富文本编辑器的实现示例
Apr 10 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
python3中for循环踩过的坑记录
Dec 14 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 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重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php+mysql事务rollback&commit示例
2010/02/08 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
document.documentElement && document.documentElement.scrollTop
2007/12/01 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
p5.js实现动态图形临摹
2019/10/23 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
浅谈python中的占位符
2017/11/09 Python
python实现单向链表详解
2018/02/08 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
考博自荐信
2013/10/25 职场文书
受欢迎的大学生自我评价
2013/12/05 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
青奥会口号
2014/06/12 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
2015迎新晚会开场白
2015/05/29 职场文书