一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2021-01-28 编辑:袖梨 来源:一聚教程网

本篇文章小编给大家分享一下Python3中对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之后与之对应的数据类型、

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

print(type(js_loads_data))
>>>

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

print(js_loads_data["id"])
>>>3
print(type(js_loads_data["id"]))
>>>

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

同理

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

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

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

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

所以我们可以通

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

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

print(js_loads_data['result'][0])
# 可以将列表下标为0的一个数据取出来
print(type(js_loads_data['result'][0]))
>>>
# 打印类型发现,列表里面的第一个元素为字典类型,那么我们又知道了如何访问该字典里面的数据:
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

处理完成

热门栏目