Python如何修改JSON数据格式:从读取到修改的完整指南
在Python开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于配置文件、API数据交互、数据存储等场景,经常需要对JSON数据进行修改,比如更新字段值、添加新键值对、删除数据或调整数据结构,本文将详细介绍如何使用Python修改JSON数据格式,涵盖从读取JSON文件到数据修改,再到重新保存的完整流程,并提供常见场景的代码示例。
JSON数据在Python中的表示:dict与list
在Python中,JSON数据会被解析为两种核心类型:
- JSON对象()对应Python的字典(
dict) - JSON数组(
[])对应Python的列表(list)
以下JSON数据:
{
"name": "张三",
"age": 25,
"hobbies": ["reading", "coding"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
在Python中会被解析为:
{
"name": "张三", # str
"age": 25, # int
"hobbies": ["reading", "coding"], # list
"address": { # dict(嵌套JSON对象)
"city": "北京",
"district": "海淀区"
}
}
理解这种对应关系是修改JSON数据的基础——因为本质上我们是在操作Python的字典和列表。
修改JSON数据的完整流程
修改JSON数据通常分为三步:读取JSON数据 → 修改Python对象(dict/list) → 将修改后的数据重新保存为JSON。
读取JSON数据:json模块的load()与loads()
Python内置的json模块提供了两个核心方法用于读取JSON数据:
json.load(file_object):从文件对象读取JSON数据(适用于读取本地JSON文件)。json.loads(json_str):从JSON格式字符串解析数据(适用于处理API返回的JSON数据或内存中的字符串)。
示例1:从本地JSON文件读取
假设有一个user.json如下:
{
"name": "张三",
"age": 25,
"hobbies": ["reading", "coding"]
}
使用json.load()读取:
import json
# 打开文件并读取JSON数据
with open("user.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data) # 输出:{'name': '张三', 'age': 25, 'hobbies': ['reading', 'coding']}
示例2:从JSON字符串解析
import json
json_str = '{"name": "李四", "age": 30, "hobbies": ["sports"]}'
data = json.loads(json_str)
print(data) # 输出:{'name': '李四', 'age': 30, 'hobbies': ['sports']}
修改Python对象(dict/list):字典与列表的操作
读取JSON数据后,我们得到的是Python的dict或list,可以通过常规的字典和列表操作修改数据。
场景1:修改字段值(字典键值修改)
直接通过键(key)访问并修改字典的值,与普通字典操作一致。
示例:将"age"从25改为26,将"name"从"张三"改为"张三丰":
data["age"] = 26
data["name"] = "张三丰"
print(data) # 输出:{'name': '张三丰', 'age': 26, 'hobbies': ['reading', 'coding']}
场景2:添加新的键值对
直接通过字典[新键] = 新值添加,如果键已存在,则会覆盖原值。
示例:添加"email"字段和"is_student"字段:
data["email"] = "zhangsanfeng@example.com"
data["is_student"] = False
print(data)
# 输出:{'name': '张三丰', 'age': 26, 'hobbies': ['reading', 'coding'],
# 'email': 'zhangsanfeng@example.com', 'is_student': False}
场景3:删除键值对
使用del语句或dict.pop()方法删除指定键。
示例:删除"hobbies"字段:
# 方法1:使用del
del data["hobbies"]
# 方法2:使用pop(可返回被删除的值)
# deleted_hobbies = data.pop("hobbies")
print(data) # 输出:{'name': '张三丰', 'age': 26, 'email': 'zhangsanfeng@example.com', 'is_student': False}
场景4:修改列表数据(JSON数组)
如果JSON数据中包含列表(如"hobbies"),可以通过列表的索引、切片或方法修改。
示例1:修改列表中的单个元素(将"reading"改为"swimming"):
data["hobbies"] = ["reading", "coding"] # 先恢复hobbies字段 data["hobbies"][0] = "swimming" print(data["hobbies"]) # 输出:['swimming', 'coding']
示例2:向列表添加元素(在末尾添加"gaming"):
data["hobbies"].append("gaming")
print(data["hobbies"]) # 输出:['swimming', 'coding', 'gaming']
示例3:删除列表中的元素(删除"coding"):
# 方法1:使用del按索引删除
del data["hobbies"][1]
# 方法2:使用remove按值删除
# data["hobbies"].remove("coding")
print(data["hobbies"]) # 输出:['swimming', 'gaming']
场景5:修改嵌套JSON数据(字典嵌套字典)
如果JSON数据包含嵌套结构(如"address"字段),需要逐层访问并修改。
示例:假设JSON数据中包含嵌套的"address"字段,修改城市和添加邮编:
data["address"] = {"city": "北京", "district": "海淀区"} # 先添加address字段
data["address"]["city"] = "上海" # 修改城市
data["address"]["zip_code"] = "200000" # 添加邮编
print(data["address"]) # 输出:{'city': '上海', 'district': '海淀区', 'zip_code': '200000'}
场景6:批量修改或条件修改
通过循环或条件判断实现批量修改。
示例:将"hobbies"列表中的所有元素转为大写:
data["hobbies"] = ["reading", "coding", "gaming"] data["hobbies"] = [hobby.upper() for hobby in data["hobbies"]] print(data["hobbies"]) # 输出:['READING', 'CODING', 'GAMING']
示例:如果"age"大于25,则将其加1:
if data["age"] > 25:
data["age"] += 1
print(data["age"]) # 输出:27(假设原age为26)
保存修改后的数据:json模块的dump()与dumps()
修改完成后,需要将Python对象重新转换为JSON格式并保存。json模块提供了两个方法:
json.dump(data, file_object):将Python对象写入文件对象(保存到本地JSON文件)。json.dumps(data):将Python对象转换为JSON格式字符串(适用于网络传输或内存处理)。
示例1:保存到本地JSON文件
import json
# 将修改后的数据写入文件(indent=4表示格式化输出,确保可读性)
with open("user_modified.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
# 查看生成的文件内容
with open("user_modified.json", "r", encoding="utf-8") as f:
print(f.read())
输出文件user_modified.json内容:
{
"name": "张三丰",
"age": 27,
"email": "zhangsanfeng@example.com",
"is_student": false,
"hobbies": [
"READING",
"CODING",
"GAM


还没有评论,来说两句吧...