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中内建函数的简单用法说明
May 05 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
python实现批量修改文件名代码
Sep 10 Python
Python编写一个优美的下载器
Apr 15 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
详解pandas的外部数据导入与常用方法
May 01 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
Pyhton模块和包相关知识总结
May 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jquery cookie插件代码类
2009/05/26 Javascript
js模拟类继承小例子
2010/07/17 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
javascript实现动态标签云
2015/10/16 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python使用socket连接远程服务器的方法
2015/04/29 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
Python子类继承父类构造函数详解
2019/02/19 Python
Python编程中类与类的关系详解
2019/08/08 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
数据库面试要点基本概念
2013/10/31 面试题
办公室内勤岗位职责范本
2013/12/09 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
监理中标通知书
2015/04/16 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
python​格式化字符串
2022/04/20 Python