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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
Python生成随机密码
Mar 10 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
简单谈谈python的反射机制
Jun 28 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
python从PDF中提取数据的示例
Oct 30 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Python PIL按比例裁剪图片
May 11 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 的 __FILE__ 常量
2007/01/15 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
WordPress网站性能优化指南
2015/11/18 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
echart简介_动力节点Java学院整理
2017/08/11 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
Delphi工程师笔试题
2013/09/21 面试题
入党自我鉴定范文
2013/10/04 职场文书
宝宝周岁宴答谢词
2014/01/26 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
《四季》教学反思
2014/04/08 职场文书
物业工程部岗位职责
2015/02/11 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
Vue3中的Refs和Ref详情
2021/11/11 Vue.js