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 11 Python
python基础教程之Filter使用方法
Jan 17 Python
Python内置模块logging用法实例分析
Feb 12 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
实例详解Python模块decimal
Jun 26 Python
详解Python绘图Turtle库
Oct 12 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 Python
python代码如何实现余弦相似性计算
Feb 09 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python实现发送带附件的邮件代码分享
Sep 22 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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
vue中如何使用ztree
2018/02/06 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
Python实现的中国剩余定理算法示例
2017/08/05 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Python集合操作方法详解
2020/02/09 Python
基于matplotlib xticks用法详解
2020/04/16 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
运动会四百米广播稿
2014/01/19 职场文书
汉语言文学职业规划
2014/02/14 职场文书
讲座主持词
2014/03/20 职场文书
电气自动化求职信
2014/06/24 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
羊脂球读书笔记
2015/06/30 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python