Python3中解析JSON数据并转换为字典与列表

方予
方予
发布时间:2026-10-11| 4人浏览过
原创

本文介绍如何在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数据的关键步骤包括:

  1. 使用json模块将JSON字符串编码或解码为Python原生数据类型。
  2. 利用type()函数分析每个元素的类型,明确数据结构。
  3. 根据JSON串的结构,使用字典键访问或列表下标访问来提取所需信息。

以上就是Python3中解析JSON数据并转换为字典与列表的详细内容,更多关于Python JSON处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。