怎么把字符串写到JSON文件:从基础到实践的完整指南
在Python开发中,将字符串数据保存到JSON文件是一项基础且高频的操作,无论是配置信息、日志数据还是结构化结果,JSON文件因其可读性强、跨语言兼容的特性,成为数据存储的首选格式之一,本文将从“为什么用JSON”“核心步骤”“代码实现”“常见问题”四个维度,手把手教你“把字符串写到JSON文件”的完整流程。
为什么选择JSON文件存储字符串?
在开始操作前,先明确两个核心概念:字符串(String)和JSON格式数据。
- 字符串是文本数据的统称,比如
"{"name": "张三", "age": 18}"本身就是一个字符串,但它只是文本,不具备结构化数据的特性。 - JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以“键值对”的形式组织数据,类似Python中的字典(dict)或列表(list)。
{"name": "张三", "age": 18}就是标准的JSON对象。
将字符串写入JSON文件的本质,是将字符串“格式化”为符合JSON规范的结构,并持久化存储到文件中,这样做的好处是:
- 数据结构清晰,便于人工阅读和调试;
- 可被其他编程语言(如JavaScript、Java)直接解析;
- 支持嵌套、数组等复杂数据结构,扩展性强。
核心步骤:三步搞定字符串写入JSON文件
无论使用什么编程语言,将字符串写入JSON文件的核心步骤都可分为三步:
- 准备符合JSON格式的数据:如果原始字符串本身就是JSON格式(如
'{"key": "value"}'),可直接使用;如果不是,需先将其转换为JSON兼容的结构(如字典、列表)。 - 打开文件并设置写入模式:以“写入”或“追加”模式打开文件,注意指定编码格式(推荐
utf-8,避免中文乱码)。 - 将数据写入文件并格式化:使用JSON库将数据序列化为字符串,并写入文件,同时通过参数控制缩进、换行,提升可读性。
Python实现:从基础到进阶的代码示例
Python内置了json模块,无需安装即可直接使用,是处理JSON数据的利器,下面通过具体场景,展示不同情况下的字符串写入方法。
场景1:直接写入JSON格式的字符串
假设我们有一个已经是JSON格式的字符串,比如存储用户信息的'{"name": "李四", "age": 20, "hobbies": ["reading", "coding"]}',直接将其写入JSON文件即可。
import json
# 1. 准备JSON格式的字符串
json_str = '{"name": "李四", "age": 20, "hobbies": ["reading", "coding"]}'
# 2. 打开文件(以写入模式,utf-8编码)
# 使用with语句自动管理文件资源,避免忘记关闭文件
with open("user.json", "w", encoding="utf-8") as f:
# 3. 直接写入字符串(注意:这里不需要json.dumps,因为已经是JSON字符串)
f.write(json_str)
print("JSON字符串已写入user.json文件")
执行后,当前目录会生成user.json为:
{"name": "李四", "age": 20, "hobbies": ["reading", "coding"]}
场景2:将Python对象转换为JSON字符串后写入
更常见的情况是:我们手头的是Python对象(如字典、列表),需要先将其转换为JSON字符串,再写入文件,这时需要用到json.dumps()方法(“dumps”即“dump string”,将对象序列化为JSON字符串)。
import json
# 1. 准备Python对象(字典)
user_data = {
"name": "王五",
"age": 25,
"is_student": False,
"courses": ["数学", "英语", "编程"],
"info": None # JSON中的null对应Python的None
}
# 2. 打开文件
with open("student.json", "w", encoding="utf-8") as f:
# 3. 使用json.dumps()将对象转换为JSON字符串,并写入文件
# indent=4:指定缩进为4个空格,让文件更易读
# ensure_ascii=False:允许非ASCII字符(如中文)直接输出,避免转义
json_str = json.dumps(user_data, indent=4, ensure_ascii=False)
f.write(json_str)
print("Python对象已转换为JSON字符串并写入student.json文件")
执行后,student.json如下(格式化后,更易阅读):
{
"name": "王五",
"age": 25,
"is_student": false,
"courses": [
"数学",
"英语",
"编程"
],
"info": null
}
关键参数说明:
indent:控制缩进空格数,None或0表示不换行(紧凑格式),正整数表示缩进量,适合调试和人工阅读。ensure_ascii:默认为True,非ASCII字符(如中文)会被转义为\u格式;设为False可保留原字符,更符合中文场景需求。
场景3:追加JSON数据到已有文件
如果需要在已有JSON文件中追加数据(比如日志记录),需注意:JSON文件通常是一个完整的“对象”或“数组”,直接追加可能会破坏格式,正确做法是:
- 若文件是JSON数组(如
[{"key1": "value1"}, {"key2": "value2"}]),先读取数组,追加新数据,再写回; - 若文件是单个JSON对象,建议改为存储对象列表,或追加为新的JSON对象(需用分隔符区分)。
以下演示“向JSON数组文件追加数据”的示例:
import json
# 假设已有user_list.json文件,内容为:[{"name": "张三", "age": 18}]
new_user = {"name": "赵六", "age": 30}
# 1. 读取现有JSON文件(若文件不存在,则初始化为空列表)
try:
with open("user_list.json", "r", encoding="utf-8") as f:
user_list = json.load(f) # json.load()直接从文件读取JSON对象
except FileNotFoundError:
user_list = []
# 2. 追加新数据
user_list.append(new_user)
# 3. 写回文件
with open("user_list.json", "w", encoding="utf-8") as f:
json.dump(user_list, f, indent=4, ensure_ascii=False) # json.dump()直接将对象写入文件(无需手动dumps)
print("新数据已追加到user_list.json文件")
执行后,user_list.json内容更新为:
[
{
"name": "张三",
"age": 18
},
{
"name": "赵六",
"age": 30
}
]
场景4:写入非JSON字符串并手动格式化(不推荐)
如果字符串本身不是JSON格式(如纯文本"Hello, JSON!"),但希望写入.json文件,可以直接写入,但这样文件不具备JSON的结构化特性,仅作为文本存储。
text_str = "这是一段普通文本,不是JSON格式。"
with open("text_data.json", "w", encoding="utf-8") as f:
f.write(text_str)
print("非JSON字符串已写入text_data.json文件")
此时text_data.json内容就是纯文本,无法通过JSON解析器直接解析,仅建议在明确不需要JSON结构时使用。
常见问题与解决方案
问题:写入中文后显示为\u编码(如\u5f20\u4e09)
原因:json.dumps()默认ensure_ascii=True,会将非ASCII字符转义。
解决:设置ensure_ascii=False,如场景2中的示例。
问题:TypeError: Object of type function is not JSON serializable
原因:尝试序列化Python不可JSON化的对象(如函数、类实例)。
解决:
-
忽略不可序列化的对象:使用
default参数,传入函数处理特殊对象。def handle_non_serializable(obj): return str(obj) # 将函数转换为字符串 json.dumps(lambda x: x + 1, default=handle_non_serializable) # 输出:"<function <lambda> at 0x...>" -
使用第三方库(如
orjson)支持更多类型,但需先安装。



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