查看: 698|回复: 3

Python json.loads与json.dump用法详解及JSON

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
在前后端接口交互、配置文件处理、日志导出等日常开发场景中,JSON 是使用最广泛的数据交换格式之一。Python 内置的 json 模块提供了高效的序列化与反序列化能力,其中 json.loads() 负责把 JSON 字符串还原为 Python 对象,json.dump() 负责把 Python 对象序列化并写入 JSON 文件。理解并灵活使用这两个方法,是处理 API 响应、数据配置和本地存储的基础技能。

一、json.loads():将 JSON 字符串解析为 Python 对象

json.loads() 接收一个合法的 JSON 字符串,并返回对应的 Python 原生数据类型,如 dict、list、str、int、bool 或 None。由于 JSON 对象本质上等同于 Python 字典,所以解析后可以像操作普通字典一样访问字段。

下面的代码演示了最基本的解析过程:
  1. import json
  2. json_str = '{"name": "Alice", "age": 30, "city": "New York"}'
  3. data = json.loads(json_str)
  4. print(data)
  5. print(type(data))
  6. print(data["name"])
复制代码

运行结果会依次输出字典内容、类型 dict 以及字段值 Alice。需要注意的是,JSON 字符串中必须使用双引号,不能使用单引号;如果输入字符串不符合 JSON 语法,会抛出 json.JSONDecodeError。

json.loads() 也支持解析 JSON 数组字符串,解析后得到 Python 列表:
  1. import json
  2. json_arr = '[1, 2, 3, "hello"]'
  3. py_list = json.loads(json_arr)
  4. print(py_list)
复制代码

输出为 [1, 2, 3, 'hello']。除了最常用的默认解析,json.loads() 还提供了一些高阶参数,例如 object_hook 可以在字典解码后执行自定义逻辑,parse_float 可以指定浮点数解析类型(如 Decimal)。这些参数在普通业务中较少使用,但遇到特殊数据格式时能派上用场。

二、json.dump():将 Python 对象写入 JSON 文件

json.dump() 与 json.dumps() 不同:json.dumps() 返回 JSON 字符串,而 json.dump() 直接将序列化结果写入文件对象。其典型用法是配合 open() 打开一个文件,再通过 fp 参数传入文件句柄。

基础写法如下:
  1. import json
  2. data = {
  3.     "title": "Hello World",
  4.     "content": "This is a test article.",
  5.     "author": "John"
  6. }
  7. with open("output.json", "w", encoding="utf-8") as f:
  8.     json.dump(data, f, ensure_ascii=False, indent=4)
复制代码

执行后 output.json 文件中的内容会是带有 4 个空格缩进且未进行 Unicode 转义的 JSON 对象。这里有两个关键参数需要掌握:

ensure_ascii=False 表示将中文等非 ASCII 字符原样输出,而不是默认转义成 \uxxxx 形式;indent=4 则控制缩进级别,让文件内容具备可读性。除此之外,json.dump() 还支持 sort_keys(按字典键排序输出)和 separators(自定义元素分隔符,例如 (',', ': '))等参数。

如果文件中需要出现中文,尤其是当作配置文件或导出数据时,务必显式指定 ensure_ascii=False,否则生成的内容会变得难以直接阅读。

三、组合使用 json.load() 和 json.dump():读取修改后写回

json.dump() 的典型工作流不只是简单写入,而是先读取已有 JSON 文件,修改字段后再写回。读取文件时通常使用 json.load(),它从文件对象中解析 JSON;写入时使用 json.dump()。二者配合,可以完成一次完整的“读取-修改-落盘”过程:
  1. import json
  2. # 读取原始 JSON 文件
  3. with open("input.json", "r", encoding="utf-8") as f:
  4.     data = json.load(f)
  5. # 修改数据
  6. data["status"] = "published"
  7. # 写回新文件
  8. with open("output.json", "w", encoding="utf-8") as f:
  9.     json.dump(data, f, ensure_ascii=False, indent=4)
复制代码

在实际项目中,这种模式常被用于配置更新、状态切换和批处理任务。需要注意的是,json.load() 和 json.loads() 的参数不同:json.load() 接收文件对象,json.loads() 接收字符串对象,二者不能混用。

四、实战场景一:解析 API 返回的 JSON 响应

调用远程接口时,requests 库返回的 response.text 通常是 JSON 字符串,直接使用 json.loads() 可以快速转换为可遍历的 Python 对象:
  1. import requests
  2. import json
  3. response = requests.get("https://api.example.com/data")
  4. data = json.loads(response.text)
  5. print(data["key"])
复制代码

这段代码的前提是接口确实返回合法 JSON。如果返回空内容或错误页,json.loads() 会抛出异常,因此生产代码里建议增加异常捕获或状态码判断,不过这不是本文重点。

五、实战场景二:读取 JSON 配置文件

很多项目会用 JSON 文件保存数据库连接信息、日志级别等配置。使用 json.load() 读取后,可以直接通过嵌套字典的 key 访问配置项:
  1. import json
  2. with open("config.json", "r", encoding="utf-8") as f:
  3.     config = json.load(f)
  4. print(config["database"]["host"])
复制代码

六、实战场景三:封装通用的数据导出函数

如果多个接口或脚本都需要把 Python 对象导出为 JSON 文件,可以封装一个小函数,统一缩进和编码行为:
  1. import json
  2. def export_to_json(data, filename):
  3.     with open(filename, "w", encoding="utf-8") as f:
  4.         json.dump(data, f, indent=2, ensure_ascii=False)
复制代码

之后在任何地方只需调用 export_to_json(data, "result.json") 即可生成格式化文件,避免重复书写打开文件与 dump 的逻辑。

七、实战场景四:使用自定义编码器处理 datetime 对象

JSON 无法直接序列化 datetime 类型,默认调用 json.dump() 时会报 TypeError。解决办法是继承 json.JSONEncoder 并重写 default 方法,把 datetime 对象转换为 ISO 格式字符串:
  1. import json
  2. from datetime import datetime
  3. class DateTimeEncoder(json.JSONEncoder):
  4.     def default(self, obj):
  5.         if isinstance(obj, datetime):
  6.             return obj.isoformat()
  7.         return super().default(obj)
  8. data = {"timestamp": datetime.now()}
  9. with open("time.json", "w") as f:
  10.     json.dump(data, f, cls=DateTimeEncoder)
复制代码

这样 time.json 中的 timestamp 就会以类似 2025-01-01T12:30:45 的字符串格式落盘。需要时还可以在读取后使用 datetime.fromisoformat() 还原为时间对象。

总结:json.loads() 负责把 JSON 字符串转换为 Python 对象,突出的是一个“解析”;json.dump() 负责把 Python 对象写入文件,突出的是一个“序列化与持久化”。掌握这两个方法,再配合 json.load() 读取文件,就能覆盖大多数 JSON 数据处理需求。后续在爬虫解析、后端接口开发或数据分析过程中,你会发现这两个方法几乎无处不在。
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层

Re: Python json.loads与json.dump用法详解及JSON

感谢楼主的分享,写得很清晰!作为经常处理接口数据的开发者,确实深有体会。`json.loads()` 和 `json.dump()` 的基本用法讲得很透彻,特别是 **`ensure_ascii=False`** 和 **`indent=4`** 这两个参数,几乎是写入中文配置文件时的标配,初学者很容易被默认的 `\u` 转义搞懵。 另外,楼主提到 `json.load()` 和 `json.loads()` 的区别也很关键,这个坑很多新手容易踩。我平时还会注意一点,就是如果用 `json.dump()` 写入文件时,最好也确认一下文件打开模式是 `"w"` 且编码为 `utf-8`,否则在某些 Windows 环境下可能遇到编码问题。 期待楼主后续补完实战部分,比如“读取 JSON 配置文件”的完整示例,如果能顺带提一下异常处理(比如 `JSONDecodeError`)就更完美了。感谢分享,学习了!
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层

Re: Python json.loads与json.dump用法详解及JSON

楼主这篇 JSON 用法详解写得很清楚,尤其把 `json.loads()` 和 `json.dump()` 的区别、`ensure_ascii=False` 和 `indent` 这类常用参数都点到了,对刚接触 Python 处理 JSON 的朋友来说非常实用。我自己平时写配置文件也经常用这个组合,读取-修改-写回那段挺有共鸣的。唯一想补充的是,如果解析外部接口返回的数据,确实像楼主说的建议先判空或做异常处理,这样更稳妥。感谢分享!
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层

Re: Python json.loads与json.dump用法详解及JSON

楼主的整理很清晰,把 `loads` 和 `dump` 的对应关系、参数细节还有读写文件的配合都讲明白了,尤其是 `ensure_ascii=False` 和 `indent` 这两个参数,实际写配置文件时确实几乎每次都会用到。 补充一个自己踩过的小坑:用 `dump` 写文件时,如果传入的是文件句柄,记得用 `with open(..., "w", encoding="utf-8")` 这种方式打开,不然系统默认编码可能在 Windows 上出问题。另外读取文件时 `json.load` 和 `json.loads` 确实容易搞混,楼主最后特意区分了文件对象和字符串,很贴心。 手动解析 API 响应时,我一般会习惯用 `response.json()`,不过如果返回内容不是纯 JSON 或者需要更精细的解析控制,按楼主说的用 `json.loads(response.text)` 会更稳一点,异常也好单独处理。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-12 13:17 , Processed in 0.023740 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部