Python3 JSON 数据解析(手把手讲解)

Python3 JSON 数据解析:从入门到实战

在现代编程中,数据交换格式的选择至关重要。而 JSON(JavaScript Object Notation)凭借其轻量、易读、跨语言的特性,已经成为前后端通信、API 接口交互的标准格式之一。对于 Python 开发者来说,掌握 Python3 JSON 数据解析技能,是构建高效数据处理流程的必经之路。

Python3 内置了 json 模块,提供了完整且高效的 JSON 操作能力。无论你是初学者还是有一定经验的开发者,只要理解了基本原理,就能快速上手。本文将带你从零开始,系统性地学习 Python3 JSON 数据解析的核心知识,通过真实案例与代码实践,掌握解析、生成、错误处理等关键技巧。


什么是 JSON?为什么它如此流行?

JSON 是一种轻量级的数据交换格式,它的语法简洁,结构清晰。你可以把它想象成一个“数据信封”——把复杂的数据打包成一种标准化的形式,方便在不同系统之间传递。

一个典型的 JSON 示例:

{
  "name": "张三",
  "age": 28,
  "is_student": false,
  "hobbies": ["读书", "游泳", "编程"],
  "address": {
    "city": "北京",
    "district": "朝阳区"
  }
}

这个结构看起来像 Python 中的字典(dict),但它是纯文本格式,可以被任何支持 JSON 的语言读取。Python3 的 json 模块正是用来处理这种格式的“解码器”和“编码器”。


使用 json.loads() 解析 JSON 字符串

当你从网络请求、配置文件或数据库中获取到 JSON 数据时,它通常是以字符串形式存在的。这时就需要使用 json.loads() 方法将其转换为 Python 对象。

import json

json_string = '''
{
  "name": "李四",
  "age": 30,
  "skills": ["Python", "Django", "REST API"],
  "active": true
}
'''

data = json.loads(json_string)

print(type(data))  # <class 'dict'>
print(data["name"])  # 输出:李四
print(data["skills"])  # 输出:['Python', 'Django', 'REST API']

代码注释说明

  • json.loads() 接收一个 JSON 格式的字符串,返回对应的 Python 数据结构(如 dict、list、str、int、bool、None)。
  • 解析成功后,data 就是一个标准的 Python 字典,可以直接用字典语法访问键值。
  • 注意:JSON 中的 true 转为 Python 的 Truefalse 转为 Falsenull 转为 None

使用 json.load() 从文件中读取 JSON 数据

实际项目中,JSON 数据往往保存在文件中(如 config.jsondata.json)。这时可以使用 json.load() 方法直接从文件对象中读取并解析。

import json


with open("data.json", "r", encoding="utf-8") as file:
    config_data = json.load(file)

print(config_data["version"])  # 输出:1.0
for user in config_data["users"]:
    print(f"用户:{user['name']},邮箱:{user['email']}")

代码注释说明

  • json.load() 接收一个打开的文件对象,无需手动读取字符串。
  • 使用 with open() 可确保文件正确关闭,避免资源泄漏。
  • encoding="utf-8" 保证中文字符不会乱码。
  • 通过 config_data["users"] 获取列表,再遍历每个用户字典。

将 Python 对象转换为 JSON 字符串:json.dumps()

在某些场景下,你需要将 Python 数据结构(如字典、列表)转换为 JSON 字符串,以便写入文件或发送到服务器。

import json

user_data = {
    "username": "alice",
    "friends": ["bob", "charlie"],
    "preferences": {
        "theme": "dark",
        "notifications": True
    },
    "score": 98.5,
    "last_login": None
}

json_string = json.dumps(user_data, ensure_ascii=False, indent=2)

print(json_string)

输出结果:

{
  "username": "alice",
  "friends": [
    "bob",
    "charlie"
  ],
  "preferences": {
    "theme": "dark",
    "notifications": true
  },
  "score": 98.5,
  "last_login": null
}

代码注释说明

  • json.dumps() 将 Python 对象转换为 JSON 字符串。
  • ensure_ascii=False 保证中文字符不被转义为 Unicode(如 \u4e2d),输出更可读。
  • indent=2 表示缩进两个空格,使输出格式美观,便于调试。
  • None 转为 nullTrue 转为 trueFalse 转为 false,完全符合 JSON 规范。

处理嵌套结构与复杂数据

真实场景中,JSON 数据往往是多层嵌套的。比如一个订单系统,包含用户、商品、地址等多个层级。

import json

order_data = {
    "order_id": "ORD20240501",
    "customer": {
        "name": "陈七",
        "phone": "13800138000",
        "address": {
            "street": "朝阳路 123 号",
            "city": "北京"
        }
    },
    "items": [
        {"product": "笔记本电脑", "price": 5999.0, "quantity": 1},
        {"product": "鼠标", "price": 99.0, "quantity": 2}
    ],
    "total": 6197.0,
    "status": "已发货"
}

print(f"订单号:{order_data['order_id']}")
print(f"客户姓名:{order_data['customer']['name']}")
print(f"收货地址:{order_data['customer']['address']['street']},{order_data['customer']['address']['city']}")

print("商品清单:")
for item in order_data["items"]:
    subtotal = item["price"] * item["quantity"]
    print(f"  - {item['product']} × {item['quantity']} = ¥{subtotal:.2f}")

代码注释说明

  • 嵌套访问使用多层键名,如 order_data['customer']['address']['city']
  • items 是一个列表,可通过 for 循环遍历每个商品。
  • 使用格式化字符串 :.2f 保证金额保留两位小数。

错误处理与常见问题排查

在实际开发中,JSON 数据可能格式错误或缺失。此时 json.loads() 会抛出 json.JSONDecodeError 异常。

import json

invalid_json = '{"name": "测试", "age": 25, "city": }'  # 错误:缺少值

try:
    data = json.loads(invalid_json)
except json.JSONDecodeError as e:
    print(f"JSON 解析失败:{e}")
    print(f"错误位置:第 {e.lineno} 行,第 {e.colno} 列")

代码注释说明

  • 使用 try-except 捕获解析异常,防止程序崩溃。
  • e.linenoe.colno 提供错误发生的精确位置,便于调试。
  • 常见错误包括:缺少引号、逗号缺失、括号不匹配、使用单引号等。

实用技巧:自定义序列化与编码选项

json.dumps() 支持多种参数,让你灵活控制输出格式。

参数 作用 示例
ensure_ascii=False 保留中文字符,不转义 json.dumps({"msg": "你好"})"你好"
indent 设置缩进空格数 indent=4 输出更清晰
sort_keys=True 按键名排序 键值对按字母顺序排列
separators 自定义分隔符 separators=(',', ':')
import json

data = {"z": 1, "a": 2, "c": 3}

json_str = json.dumps(data, sort_keys=True, indent=2, ensure_ascii=False)
print(json_str)

输出:

{
  "a": 2,
  "c": 3,
  "z": 1
}

代码注释说明

  • sort_keys=True 使键按字母顺序排列,适合用于生成一致的 JSON 输出。
  • 这些选项在配置文件、API 响应、日志记录等场景中非常实用。

结语

Python3 JSON 数据解析是 Python 开发中不可或缺的基础技能。无论是处理 API 返回数据、读写配置文件,还是构建数据接口,掌握 json.loads()json.load()json.dumps() 等核心方法,都能让你事半功倍。

从简单的键值对解析,到嵌套结构遍历,再到异常处理与格式优化,本文通过清晰的结构和真实代码示例,带你一步步掌握 Python3 JSON 数据解析的精髓。记住,理解数据结构是第一步,熟练使用工具是关键。

当你能自如地读取、处理、生成 JSON 数据时,你就迈出了构建现代应用的重要一步。继续练习,多写代码,让这些知识点真正成为你的“肌肉记忆”。