Python读写JSON数据完整指南:编码、解码与自定义处理
本文详解Python中json模块的使用,涵盖dumps和loads函数的基本用法,演示如何将Python数据结构转换为JSON字符串及反向解析。内容还包括使用indent参数美化输出、处理非标准数据类型、通过object_hook自定义解码逻辑,以及实现对象实例的序列化方法,帮助开发者高效处理JSON数据。
Python读写JSON数据完整指南:编码、解码与自定义处理
读写 JSON 数据
问题描述
问题
你需要处理以 JavaScript Object Notation (JSON) 格式编码的数据文件。
解决方案
解决方案
Python 内置的 json 模块提供了简便的 JSON 编码与解码方式,核心功能由 json.dumps() 和 json.loads() 两个函数实现。
以下示例展示了如何将 Python 数据结构转换为 JSON 格式字符串:
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}json_str = json.dumps(data)
下面演示如何将一个 JSON 编码的字符串转换回一个 Python 数据结构:
data = json.loads(json_str)
如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load()来编码和解码 JSON 数据。
例如:
# 写入一个json数据
with open('data.json', 'w') as f:j
son.dump(data, f)
with open('data.json', 'r') as f:
data = json.load(f)
深入讨论
讨论
JSON 编码支持的基本数据类型包括 None、bool、int、float 和 str,以及由这些类型组成的 lists、tuples 和 dictionaries。对于 dictionaries,其 key 必须为字符串类型;若字典中包含非字符串类型的 key,编码时会先将其转换为字符串。
为符合 JSON 规范,建议仅编码 Python 的 lists 和 dictionaries。在 Web 应用程序中,顶层对象编码为字典是标准做法。JSON 编码结果与 Python 语法几乎一致,主要差异在于:True 映射为 true,False 映射为 false,None 映射为 null。示例如下:
>>> json.dumps(False)
'false'
>>> d = {'a': True,
... 'b': 'Hello',
... 'c': None}
>>> json.dumps(d)
'{"b": "Hello", "c": null, "a": true}'
>>>
当尝试直接打印解码后的 JSON 数据时,若数据结构嵌套较深或字段众多,很难直观判断其结构。
为解决此问题,建议使用 pprint 模块中的 pprint() 函数替代普通 print()。该函数会按 key 的字母顺序排序,并以更美观的格式输出数据。
具体效果如下:

通常情况下,JSON 解码会根据数据内容生成 dicts 或 lists。
若需创建其他类型的对象,可向 json.loads() 传递 object_pairs_hook 或 object_hook 参数进行自定义处理。
例如,以下示例演示如何解码 JSON 数据,并在 OrderedDict 中保留其原始顺序:


在最后一个例子中,JSON 解码后的字典作为单个参数传递给 __init__()。随后,你可以像使用实例字典一样自由操作它。
格式化输出技巧
在编码 JSON 时,还有一些实用选项。若希望获得格式美观的字符串输出,可使用 json.dumps() 的 indent 参数,其效果类似于 pprint()。例如:

对象序列化处理
普通的对象实例通常无法直接进行 JSON 序列化。
若需序列化对象实例,可提供一个自定义函数,该函数接收实例作为输入,并返回一个可序列化的字典。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













