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 相关文章推荐
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
浅谈python jieba分词模块的基本用法
Nov 09 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
python代理工具mitmproxy使用指南
Jul 04 Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 Python
Python文件操作方法详解
Feb 09 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
Python析构函数__del__定义原理解析
Nov 20 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 Python
python 自动刷新网页的两种方法
Apr 20 Python
pytorch 中nn.Dropout的使用说明
May 20 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生成静态页
2006/11/25 PHP
让PHP支持断点续传的源码
2010/05/16 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
JavaScript的Function详细
2006/11/14 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
js随机生成一个验证码
2017/06/01 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python递归计算N!的方法
2015/05/05 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
公司JAVA开发面试题
2015/04/02 面试题
农药学硕士毕业生自荐信
2013/09/25 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
大学生预备党员自我评价
2015/03/04 职场文书