Python中如何为JSON数组赋值:从基础到实践
在Python开发中,处理JSON数据是一项常见任务,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,本文将详细介绍如何在Python中为JSON数组赋值,包括基本操作、高级技巧以及实际应用场景。
JSON数组在Python中的表示
在Python中,JSON数组实际上对应的是列表(list)数据结构,当我们从JSON字符串解析数据时,JSON数组会被转换为Python的列表;反之,当我们需要将Python数据转换为JSON字符串时,列表会被转换为JSON数组。
import json # JSON字符串 json_str = '["apple", "banana", "cherry"]' # 解析为Python列表 python_list = json.loads(json_str) print(python_list) # 输出: ['apple', 'banana', 'cherry']
直接为JSON数组赋值
创建Python列表并转换为JSON
最直接的方式是创建一个Python列表,然后使用json.dumps()方法将其转换为JSON格式的字符串。
import json # 创建Python列表 fruits = ["apple", "banana", "cherry"] # 转换为JSON字符串 json_array = json.dumps(fruits) print(json_array) # 输出: ["apple", "banana", "cherry"]
在字典中嵌套JSON数组
JSON对象(在Python中对应字典)可以包含JSON数组作为其值。
import json
# 创建包含数组的字典
data = {
"fruits": ["apple", "banana", "cherry"],
"vegetables": ["carrot", "broccoli", "spinach"]
}
# 转换为JSON字符串
json_data = json.dumps(data)
print(json_data)
输出:
{"fruits": ["apple", "banana", "cherry"], "vegetables": ["carrot", "broccoli", "spinach"]}
动态构建JSON数组
在实际应用中,我们经常需要动态构建JSON数组,以下是一些常见场景:
从用户输入构建JSON数组
import json
# 获取用户输入
input_str = input("请输入水果名称,用逗号分隔: ")
fruits = [fruit.strip() for fruit in input_str.split(',')]
# 转换为JSON数组
json_array = json.dumps(fruits)
print("生成的JSON数组:", json_array)
从文件读取数据构建JSON数组
假设我们有一个文本文件fruits.txt,每行包含一个水果名称:
apple
banana
cherry
我们可以读取文件内容并构建JSON数组:
import json
# 从文件读取数据
with open('fruits.txt', 'r') as file:
fruits = [line.strip() for line in file if line.strip()]
# 转换为JSON数组
json_array = json.dumps(fruits)
print("从文件生成的JSON数组:", json_array)
从数据库查询结果构建JSON数组
import json
import sqlite3
# 连接数据库并查询
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("SELECT name FROM fruits")
rows = cursor.fetchall()
# 将查询结果转换为列表
fruits = [row[0] for row in rows]
# 转换为JSON数组
json_array = json.dumps(fruits)
print("从数据库生成的JSON数组:", json_array)
conn.close()
修改JSON数组中的值
一旦将JSON数据解析为Python列表,就可以像操作普通列表一样修改其内容:
import json
# 原始JSON字符串
json_str = '["apple", "banana", "cherry"]'
# 解析为Python列表
fruits = json.loads(json_str)
# 修改列表内容
fruits[0] = "pear"
fruits.append("orange")
# 转换回JSON字符串
updated_json = json.dumps(fruits)
print("更新后的JSON数组:", updated_json)
输出:
更新后的JSON数组: ["pear", "banana", "cherry", "orange"]
处理复杂JSON数组
JSON数组可以包含复杂的嵌套结构,如字典或其他数组:
import json
# 复杂的JSON数组
complex_json = '''
[
{"name": "apple", "color": "red", "price": 1.2},
{"name": "banana", "color": "yellow", "price": 0.8},
[
{"name": "grape", "color": "purple", "price": 2.5},
{"name": "kiwi", "color": "green", "price": 1.8}
]
]
'''
# 解析为Python对象
data = json.loads(complex_json)
# 访问和修改嵌套数据
data[0]["price"] = 1.5
data[2][0]["price"] = 2.0
# 转换回JSON字符串
updated_json = json.dumps(data, indent=2)
print("更新后的复杂JSON数组:")
print(updated_json)
JSON数组的实用技巧
使用default参数处理非JSON原生类型
Python的某些类型(如datetime)不能直接序列化为JSON,可以使用default参数自定义处理方式:
from datetime import datetime
import json
def handle_datetime(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
data = {
"timestamp": datetime.now(),
"fruits": ["apple", "banana"]
}
json_str = json.dumps(data, default=handle_datetime)
print(json_str)
美化JSON输出
使用indent参数可以使输出的JSON字符串更具可读性:
import json
data = {
"fruits": ["apple", "banana", "cherry"],
"vegetables": ["carrot", "broccoli", "spinach"]
}
pretty_json = json.dumps(data, indent=4)
print(pretty_json)
处理中文字符
默认情况下,json.dumps()会将非ASCII字符转义,如果需要保留中文字符,可以设置ensure_ascii=False:
import json
data = {
"fruits": ["苹果", "香蕉", "樱桃"],
"message": "你好,世界!"
}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
实际应用示例
构建API响应
import json
def get_fruits():
return ["apple", "banana", "cherry"]
def api_response():
data = {
"status": "success",
"data": get_fruits(),
"count": len(get_fruits())
}
return json.dumps(data, ensure_ascii=False)
print(api_response())
配置文件管理
import json
import os
def save_config(config, filename="config.json"):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4, ensure_ascii=False)
def load_config(filename="config.json"):
if not os.path.exists(filename):
return {}
with open(filename, 'r', encoding='utf-8') as f:
return json.load(f)
# 示例使用
config = {
"database": {
"host": "localhost",
"ports": [3306, 3307]
},
"features": ["auth", "logging"]
}
save_config(config)
loaded_config = load_config()
print(loaded_config)
常见问题与解决方案
Unicode编码问题
问题:中文字符显示为Unicode转义序列
解决:使用ensure_ascii=False
data = {"message": "你好"}
print(json.dumps(data)) # 默认转义
print(json.dumps(data, ensure_ascii=False)) # 正常显示
循环引用问题
问题:包含循环引用的数据结构无法序列化
解决:使用default参数或第三方库如orjson
import json
a = {}
b = {}
a['b'] = b
b['a'] = a # 循环引用
try:
json.dumps(a)
except TypeError as e:
print(f"错误: {e}")
处理大文件
问题:大JSON文件可能导致内存不足
解决:使用ijson库流式处理
import ijson
# 假设有一个大JSON文件
with open('large_file.json', 'rb') as f:
# 流式处理JSON数组中的每个元素
for item in ijson.items(f, 'item'):
process(item) # 处理每个元素
性能优化建议
- 使用
orjson替代标准库json:



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