Python中处理JSON数据的实用指南

一、开篇:JSON与Python的“那些事儿”

如果你经常跟API打交道,或者需要把数据保存到文件里,那你八成会遇到JSON这种数据格式。它就像不同编程语言之间的“通用语言”,简单、易读,还特别轻量。

Python自带的json模块,就是专门为处理JSON数据而生的。它让你能轻松地把Python里的字典、列表等数据类型,转换成JSON格式的字符串或文件;反过来,也能把JSON数据还原成Python能直接操作的对象。

本文就带你一步步掌握Python中处理JSON的核心技巧,包括读写文件、格式化输出、以及数据类型的注意事项。读完你就能在日常工作中熟练运用JSON了。

一句话总结:JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。Python的json模块是处理它的“瑞士军刀”。

二、JSON语法速览:跟Python字典有点像,但要注意几个“坑”

JSON的语法看起来很像Python的字典和列表,但细节上有一些关键区别。

一个典型的JSON示例

下面是一个描述狗狗信息的JSON对象:

{
  "name": "旺财",
  "isDog": true,
  "hobbies": ["吃", "睡", "汪汪叫"],
  "age": 3,
  "address": {
    "work": null,
    "home": ["北京市", "朝阳区"]
  }
}

JSON与Python的主要区别(新手易错点)

特性 JSON Python
字符串引号 只能用双引号 " " 单引号、双引号都行
布尔值 true / false(小写) True / False(首字母大写)
空值 null None
注释 不支持 支持 #"""
尾随逗号 不允许 允许(字典、列表末尾可加逗号)

提醒:如果你在JSON里用了单引号、加了注释、或者多了一个尾随逗号,解析时就会报错。这是新手最常踩的三个坑。

三、Python写入JSON:把数据变成JSON格式

1. 把Python字典转成JSON字符串:json.dumps()

import json

# 一个普通的Python字典
dog_rating = {"狗粮": 8, "肉干": 10, "蔬菜": 3}

# 转换成JSON字符串
json_str = json.dumps(dog_rating)
print(json_str)  
# 输出:{"dog_food": 8, "meat": 10, "vegetable": 3}

注意:字典里的数字键会被自动转成字符串,因为JSON的键必须是字符串。

data = {1: "苹果", 2: "香蕉"}
print(json.dumps(data))   # 输出:{"1": "苹果", "2": "香蕉"}

2. 把Python数据写入JSON文件:json.dump()

如果你想保存到文件,用json.dump()(没有s):

import json

dog_data = {
    "name": "旺财",
    "age": 3,
    "hobbies": ["吃", "睡"]
}

with open("dog.json", "w", encoding="utf-8") as f:
    json.dump(dog_data, f, indent=4, ensure_ascii=False)

参数说明:

  • indent=4:让输出的JSON有缩进,更易读(这就是“美化”)。
  • ensure_ascii=False:允许输出中文,否则中文会变成\uxxxx形式。

四、Python读取JSON:把JSON数据变回Python对象

1. 从JSON字符串解析:json.loads()

import json

json_str = '{"name": "旺财", "age": 3}'
python_dict = json.loads(json_str)
print(python_dict["name"])  # 输出:旺财

2. 从JSON文件读取:json.load()

import json

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

print(data["hobbies"])  # 输出:['吃', '睡']

五、类型对照表:Python <-> JSON 转换规则

Python 类型 转成 JSON JSON 类型 转回 Python
dict object object dict
list, tuple array array list
str string string str
int, float number number int / float
True true true True
False false false False
None null null None

⚠️ 重要陷阱:元组会变成列表

original = {"home": ("北京", "上海")}
json_str = json.dumps(original)
restored = json.loads(json_str)
print(type(restored["home"]))  # <class 'list'>  元组没了!

这是因为JSON的array没有“元组”的概念,只能转成Python的列表。如果你需要保持元组,需要自己额外处理。

六、实用技巧:让JSON更易读或更紧凑

1. 美化输出(Pretty Print)

dumpsdump时加上indent参数:

print(json.dumps({"name": "旺财", "age": 3}, indent=2))

输出:

{
  "name": "旺财",
  "age": 3
}

2. 压缩输出(Minify)

去掉多余的空格,节省空间(适合网络传输):

# 设置 separators 去掉冒号和逗号后面的空格
mini = json.dumps(data, separators=(",", ":"))

3. 终端中验证和美化JSON文件

Python提供了一个命令行工具json.tool,可以直接在终端使用:

# 验证并美化显示
python -m json.tool messy.json

# 压缩(去掉所有空白)
python -m json.tool pretty.json compact.json --compact

七、动手示例:一个完整的“宠物信息管理”小例子

import json

# 模拟从API获取的原始JSON字符串
raw_json = '''
[
    {"name": "旺财", "type": "dog", "age": 3},
    {"name": "咪咪", "type": "cat", "age": 2}
]
'''

# 解析为Python列表
pets = json.loads(raw_json)

# 添加一只新宠物
pets.append({"name": "啾啾", "type": "bird", "age": 1})

# 保存到文件(美化格式)
with open("pets.json", "w", encoding="utf-8") as f:
    json.dump(pets, f, indent=2, ensure_ascii=False)

print("保存完成!")

# 读取回来验证
with open("pets.json", "r", encoding="utf-8") as f:
    loaded_pets = json.load(f)
    for pet in loaded_pets:
        print(f"{pet['name']} - {pet['type']} - {pet['age']}岁")

八、常见问题速查

Q:JSON键可以是数字吗?
A:JSON标准要求键是字符串。Python的json.dumps()会自动把数字键转成字符串。

Q:怎么让dumps()不把中文转成\uXXXX
A:加上参数ensure_ascii=False

Q:解析出错怎么办?
A:检查是不是用了单引号、注释、或者尾随逗号。可以用json.tool在终端先验证一下。

Q:能直接转换自定义的Python对象吗?
A:可以,但需要继承JSONEncoder类并实现default()方法。一般场景下,先把对象转成字典再处理更简单。

总结

  • 核心模块json(无需额外安装)
  • 四个核心函数
    • json.dumps():Python对象 → JSON字符串
    • json.dump():Python对象 → JSON文件
    • json.loads():JSON字符串 → Python对象
    • json.load():JSON文件 → Python对象
  • 注意数据类型差异:布尔值大小写、空值、元组变列表
  • 两个实用技巧indent美化、separators压缩
  • 命令行工具python -m json.tool 验证和格式化

掌握了这些,你就能在Python项目中轻松应对各种JSON处理需求了。

更多推荐