如何在Python3中对json格式数据进行分析处理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

展示一下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)) >>>
通过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对象转为字典后,数组对应的类型为列表(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看完上述内容,你们掌握如何在Python3中对json格式数据进行分析处理的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!