Python3中解析JSON数据并转换为字典与列表
本文介绍如何在Python3中处理JSON格式数据。通过json模块将JSON字符串解码为Python原生数据类型(如字典和列表),并演示如何访问嵌套结构中的元素。文章包含具体代码示例,展示如何格式化输出JSON数据以及如何遍历和提取嵌套数组中的信息。
JSON数据在Python中的类型映射
在Python中处理JSON数据时,首先需要理解JSON格式与Python内部数据类型之间的对应关系。使用json模块进行解码(loads)或编码(dumps)时,类型转换遵循以下规则:
- JSON对象(Object)转换为Python字典(dict)。
- JSON数组(Array)转换为Python列表(list)。
- JSON字符串(String)转换为Python字符串(str)。
- JSON整数(Number)转换为Python整数(int)。
- JSON浮点数(Number)转换为Python浮点数(float)。
- JSON布尔值(true/false)转换为Python布尔值(True/False)。
- JSON null值转换为Python None。
可以通过Python内置的type()函数来验证解码后数据的实际类型。例如,访问字典中的值可以直接使用变量下标(键名)进行。
JSON数据的编码与格式化输出
在将JSON数据转换为Python对象之前,或者为了便于阅读,通常需要对JSON字符串进行格式化输出。Python的json.dumps()方法提供了便捷的格式化选项。
import json
# 假设 get_alert() 是一个返回原始JSON字符串的函数
js = json.dumps(get_alert(), indent=4, ensure_ascii=False)
print(js)在上述代码中:
indent=4:设置缩进为4个空格,使输出的JSON结构清晰易读。ensure_ascii=False:禁用ASCII编码,确保中文字符等Unicode字符能直接输出,而不是被转义为ASCII码。
以下是一个典型的Zabbix API返回的JSON示例,展示了包含触发器、主机和监控项的嵌套结构:
{
"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并访问嵌套结构
使用json.loads()方法可以将JSON字符串解码为Python原生数据类型。对于上述JSON字符串,解码后的根对象是一个字典(dict)。
js_loads_data = json.loads(js)
# 解码后的数据转为python原生的字典类型(dict)
print(type(js_loads_data))
# 输出: <class 'dict'>可以通过键名直接访问字典中的值。例如,访问id字段:
print(js_loads_data["id"])
# 输出: 3
print(type(js_loads_data["id"]))
# 输出: <class 'str'>注意,JSON中的数字在解码后可能保持为字符串类型,具体取决于JSON源的定义。访问result字段时,会发现它是一个列表(list):
print(type(js_loads_data["result"]))
# 输出: <class 'list'>遍历嵌套数组
由于result是一个列表,可以通过列表下标访问其中的元素。列表中的每个元素通常是一个字典,代表一个具体的数据对象(如触发器)。
# 获取列表中的第一个元素
print(js_loads_data['result'][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和items)仍然是列表类型。这意味着需要进一步处理这些嵌套结构。
提取嵌套列表中的特定信息
为了简化后续操作,可以将嵌套结构赋值给新变量。例如,提取所有触发器中的主机名称:
# 使用列表推导式提取hosts信息
result_list = [(item.get('hosts', 'NA')) for item in js_loads_data['result']]然后遍历这个列表,获取每个主机的名称:
for tmp in result_list:
# 注意:tmp是一个列表,包含一个字典
if tmp and tmp[0]:
print(tmp[0].get('name'))输出结果可能如下:
windows sever
linus总结
处理JSON数据的关键步骤包括:
- 使用json模块将JSON字符串编码或解码为Python原生数据类型。
- 利用type()函数分析每个元素的类型,明确数据结构。
- 根据JSON串的结构,使用字典键访问或列表下标访问来提取所需信息。
以上就是Python3中解析JSON数据并转换为字典与列表的详细内容,更多关于Python JSON处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













