Python3中对json格式数据的分析处理


Posted in Python onJanuary 28, 2021

前言

数据已经过修改,以防泄密,请放心阅读
今天同事提出一个需求,要求我修改之前的某脚本,该脚本的作用是获取zabbix监控系统返回的json数据,我的任务是使其变成易读的文本,如何获取数据不在此赘述,只描述如何对json数据进行处理

一、如何将json数据转换成python内部的数据类型

展示一下zabbix的接口返回的json数据(数据经过dumps编码了,因为原数据为str类型,只有一行,不易读)

js = json.dumps(get_alert(), indent=4, ensure_ascii=False)
print(js)
# get_alert()方法为获取json数据,编码后赋给js,打印js,结果如下:
# indent = 4意为设置缩进为4个空格,
# ensure_ascii=False参数是禁用ascii编码,若不禁用,中文字符会输出为ASCII码
{
 "jsonrpc": "2.0",
 "result": [
  {
   "triggerid": "123456",
   "expression": "{23567}>95",
   "description": "High memory utilization > 95",
   "url": "",
   "status": "0",
   "value": "1",
   "priority": "4",
   "lastchange": "123456",
   "comments": "",
   "error": "",
   "templateid": "0",
   "type": "0",
   "state": "0",
   "flags": "0",
   "recovery_mode": "0",
   "recovery_expression": "",
   "correlation_mode": "0",
   "correlation_tag": "",
   "manual_close": "0",
   "opdata": "",
   "hosts": [
    {
     "hostid": "8888",
     "name": "window_sever"
    }
   ],
   "items": [
    {
     "itemid": "123456",
     "name": "Memory utilization",
     "description": "Memory used percentage is calculated as (100-pavailable)"
    }
   ]
  },
  {
   "triggerid": "17099",
   "expression": "{20221}<{$SWAP.PFREE.MIN.WARN} and {20222}>0",
   "description": "High swap space usage ( less than 20% free)",
   "url": "",
   "status": "0",
   "value": "1",
   "priority": "2",
   "lastchange": "123456789",
   "comments": "This trigger is ignored, if there is no swap configured",
   "error": "",
   "templateid": "16176",
   "type": "0",
   "state": "0",
   "flags": "0",
   "recovery_mode": "0",
   "recovery_expression": "",
   "correlation_mode": "0",
   "correlation_tag": "",
   "manual_close": "0",
   "opdata": "Free: {ITEM.LASTVALUE1}, total: {ITEM.LASTVALUE2}",
   "hosts": [
    {
     "hostid": "10325",
     "name": "linus"
    }
   ],
   "items": [
    {
     "itemid": "31681",
     "name": "Free swap space in %",
     "description": ""
    },
    {
     "itemid": "123456",
     "name": "Total swap space",
     "description": ""
    }
   ]
  }
 ],
 "id": "3"
}

接下来我们需要对json对象进行解码

js_loads_data = json.loads(js)
# 解码后的数据转为python原生的字典类型(dict)

我们需要之后json对象里面的数据类型解码为dict之后与之对应的数据类型、

json python
object dict
array list
string str
number (int) int
number (real) float
true True
false False
null None

记不住没有关系,有方法可以现查:

print(type(js_loads_data))
>>><class 'dict'>

通过type()方法可以查看解码后数据js_loads_data的数据类型,发现他说字典类型,由此知道如何访问它内部的数据

print(js_loads_data["id"])
>>>3
print(type(js_loads_data["id"]))
>>><class 'str'>

访问字典的值直接通过改变量的下标访问即可

同理

print(type(js_loads_data["result"]))

可以取出result数组,但是这样是打印整个数组,那么如何取result数组的里面的值呢?

二、访问json对象里嵌套的数组

我们知道,json对象转为字典后,数组对应的类型为列表(list)

所以我们可以通

print(type(js_loads_data["result"]))
>>><class 'list'>

过列表的下标来访问列表的内容

print(js_loads_data['result'][0])
# 可以将列表下标为0的一个数据取出来
print(type(js_loads_data['result'][0]))
>>><class 'dict'>
# 打印类型发现,列表里面的第一个元素为字典类型,那么我们又知道了如何访问该字典里面的数据:
for key in js_loads_data['result'][0]:
 print(key, ":", js_loads_data['result'][0][key])
>>>略
>>>hosts : [{'hostid': '10358', 'name': 'FTPC01(192.168.19.5)'}]
>>>items : [{'itemid': '33152', 'name': 'Memory utilization', 'description': 'Memory used percentage is calculated as (100-pavailable)'}]
>>>略
# 依次打印键和值,观察后发现hosts和items两个元素还是列表类型,如要取值还要进行处理

btw,分享一个取出列表所有元素的简便方法:

result_list= [(item.get('hosts', 'NA')) for item in js_loads_data['result']]

这样处理之后js_loads_data[‘result']三个字典里面的result列表已经被我取出来赋值给result_list这个列表了,现在result_list是列表嵌套列表再嵌套字典的类型(不太好理解,注意观察上面的json数据),这样使接下来的操作更为简单

for tmp in result_list:
 print(tmp[0].get('name'))
>>>windows sever
>>>linus

处理完成

三、总结

拿到一个json不要慌,

先编码解码,转成python原生的数据类型一步步分析,用print(type(元素))的方法捋清楚每个元素的类型,明白整个json串的结构搞明白每个类型的访问方法这样我们就可以对整个json数据为所欲为了!

到此这篇关于Python3中对json格式数据的分析处理的文章就介绍到这了,更多相关Python json格式数据分析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
详解python 发送邮件实例代码
Dec 22 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python3实现多线程聊天室
Dec 12 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
5行Python代码实现一键批量扣图
Jun 29 Python
Python实现微信表情包炸群功能
Jan 28 #Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 #Python
python如何构建mock接口服务
Jan 28 #Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 #Python
如何用tempfile库创建python进程中的临时文件
Jan 28 #Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 #Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 #Python
You might like
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
SpringMVC简单整合Angular2的示例
2017/07/31 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
python实现文本文件合并
2015/12/29 Python
Python字符串格式化输出方法分析
2016/04/13 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
python3.7添加dlib模块的方法
2020/07/01 Python
应届毕业生的自我鉴定
2013/11/13 职场文书
好的演讲稿开场白
2013/12/30 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
群教班子对照检查材料
2014/08/26 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android