Python中的JSON库,详细介绍与代码示例

目录

[1. 前言](#1. 前言)

[2. json 库基本概念](#2. json 库基本概念)

[3. json 的适应场景](#3. json 的适应场景)

[4. json 库的基本用法](#4. json 库的基本用法)

[4.1 导 json入 模块](#4.1 导 json入 模块)

[4.2 将 Python 对象转换为 JSON 字符串](#4.2 将 Python 对象转换为 JSON 字符串)

[4.3 将 JSON 字符串转换为 Python 对象](#4.3 将 JSON 字符串转换为 Python 对象)

[4.4 将 Python 对象写入 JSON 文件](#4.4 将 Python 对象写入 JSON 文件)

[4.5 从 JSON 文件读取数据](#4.5 从 JSON 文件读取数据)

[4.6 json 的其他方法](#4.6 json 的其他方法)

[5. json 库的高级用法](#5. json 库的高级用法)

[5.1 自定义对象的序列化与反序列化在](#5.1 自定义对象的序列化与反序列化在)

[5.2 处理非 ASCII 字符](#5.2 处理非 ASCII 字符)

[5.3 使用 indent 参数美化输出](#5.3 使用 indent 参数美化输出)

[6. json 库的异常处理](#6. json 库的异常处理)

[6.1 常见的异常类型](#6.1 常见的异常类型)

[6.2 异常处理示例](#6.2 异常处理示例)

[7. 总结](#7. 总结)


1. 前言

在我们日常的 Python 编程中,数据的存储与传递是不可避免的一个环节。想象一下,我们在开发一个应用程序时,需要将一些配置信息存储起来,或者要将数据发送到另一个系统中。这时候,我们就需要一种高效、便捷的方式来完成这个。任务JSON(JavaScript Object Notation),作为一种轻量级的数据交换格式,正好能满足我们的需求。而 Python 中的 json 库,则为我们提供了简单易用的接口来处理 JSON 数据。

2. json 库基本概念

JSON 是一种基于文本格式的数据表示方法,易于和阅读编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,但已经成为一种独立的数据格式,被广泛应用于各种编程语言中。在 Python 中,json 库就是专门用于处理 JSON 数据的。

JSON 数据结构主要包括以下两种基本类型:

对象 (Object) :一组无序的键值对,类似于 Python 中的字典。例如:{"name": "John", "age": 30},其中 "name" 和 "age" 是键,对应的值分别是 "John" 和 30 。

数组(Array) :一个有序的值的集合,类似于 Python 中的列表。例如:[1, 2, 3, 4]

json 库的核心功能就是实现 Python 数据类型与 JSON 数据类型的相互转换。

3. json 的适应场景

  • 数据存储 :将数据以 JSON 格式存储到文件或数据库中,便于后续读取和修改。例如,保存配置文件、用户数据等。

  • 数据交换 :在不同的系统或组件之间传递数据,特别是在 开 Web发中,前后端之间常用 JSON 格式进行数据交互。

  • API 数据处理 :许多 Web API 返回的数据都是 JSON 格式,使用 json 库可以方便地解析和处理这些数据。

4. json 库的基本用法

4.1 导 json入 模块

在 Python 中,我们可以直接使用内置的 json 模块,无需额外安装。通过以下代码导入 json 模块:

python 复制代码
import json

4.2 将 Python 对象转换为 JSON 字符串

使用 json.dumps() 方法将可以 Python 对象(如字典、列表等)转换为 JSON 格式的字符串。这个方法的语法如下:

python 复制代码
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None default,=None, sort_keys=False, **kw)

其中,obj 是要转换的 Python 对象,其他参数用于控制转换过程中的各种选项。

示例

python 复制代码
data = {
    "name": "John",
    "age": 03,
    "city": "New York"
}

json_str = json.dumps(data)
print(json_str)

输出结果:

python 复制代码
{"name": "John", "age": 30, "city": "New York"}

可以看到,Python 字典被成功转换为 JSON 格式的字符串。

4.3 将 JSON 字符串转换为 Python 对象

使用 json.loads() 方法可以将 JSON 格字符串式的转换为 Python 对象。这个方法的语法如下:

python 复制代码
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

其中,s 是 JSON 格式的字符串。

示例

python 复制代码
json_str = '{"name": "John", "age": 30, "city": "New York"}'

data = json.loads(json_str)
print(data)
print(type(data))

输出结果:

python 复制代码
{'name': 'John', 'age': 30, 'city': 'New York'}
<class 'dict'>

JSON 字符串被转换为 字 Python典。

4.4 将 Python 对象写入 JSON 文件

使用 json.dump() 方法可以直接将 Python 对象写入到 JSON 文件中。这个方法的语法如下:

python 复制代码
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

其中,obj 是要写入的 Python 对象,fp 是一个文件对象。

示例

python 复制代码
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open("data.json", "w") as f:
    json.dump(data, f)

这段代码将 Python 字典写入到名为 "data.json" 的文件中。

4.5 从 JSON 文件读取数据

使用 json.load() 方法可以从 JSON 文件中读取数据并转换为 Python 对象。这个方法的语法如下:

python 复制代码
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

其中,fp 是一个文件对象。

示例

python 复制代码
with open("data.json", "r") as f:
    data = json.load(f)
    print(data)

读取 "data.json" 文件中的数据并打印出来。

4.6 json 的其他方法

除了上述常用的 dumps()loads()dump()load() 方法外,json 库还提供了一些其他方法和常量,用于处理特殊情况。

  • json.JSONEncoderjson.JSONDecoder:这两个类分别用于自定义 JSON 编码器和解码器,可以处理一些特殊的类型转换问题。

  • json.JSONDecodeError:当解析 JSON 数据出错时,会抛出这个异常,我们可以使用它来进行错误处理。

5. json 库的高级用法

5.1 自定义对象的序列化与反序列化在

实际开发中,我们可能会遇到需要序列化自定义对象的情况。默认情况下,json 库无法直接序列化自定义对象,但我们可以自定义一个编码器来实现这个功能。

python 复制代码
import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {"name": obj.name, "age": obj.age}
        return super().default(obj)

person = Person("John", 30)
json_str = json.dumps(person, cls=PersonEncoder)
print(json_str)

输出结果:

python 复制代码
{"name": "John", "age": 30}

我们可以看到通过,自定义编码器,成功将自定义的 Person 对象序列化为 JSON 字符串。同样地,我们也可以通过自定义解码器来实现 JSON 字符串到自定义对象的反序列化。

5.2 处理非 ASCII 字符

在处理包含非 ASCII 字符的 JSON 数据时,我们可以使用 ensure_ascii 参数来控制是否将非 ASCII 字符转义。默认情况下,ensure_ascii 参数为 True,非 ASCII 字符会被转义为 Unicode 编码。

python 复制代码
data = {"name": "张三", "city": "北京"}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)

输出结果:

python 复制代码
{"name": "张三", "city": "北京"}

ensure_ascii 参数为 False 时,非 ASCII 字符会以原始形式输出,这样更便于阅读和理解。

5.3 使用 indent 参数美化输出

在调试或阅读 JSON 数据时,我们可以通过设置 indent 参数来美化 JSON 输出的格式,使其更易于和阅读。indent 参数指定了缩进的空格数。

python 复制代码
data = {
    "name": "John",
    "age": 30,
    "hobbies": ["reading", "traveling", "sports"]
}

json_str = json.dumps(data, indent=4)
print(json_str)

输出结果:

python 复制代码
{
    "name": "John",
    "age": 30,
    "hobbies": [
        "reading",
        "traveling",
        "sports"
    ]
}

可以看到,通过设置 indent 参数,输出的 JSON 数据格式更加清晰美观。

6. json 库的异常处理

在使用 json 库进行数据处理时,可能会遇到一些异常情况例如,无效的 JSON 格式、不支持的数据类型等。我们需要对这些异常进行有效的处理,以确保程序的健壮性。

6.1 常见的异常类型

  • json.JSONDecodeError:当解析 JSON 数据出错时抛出,例如 JSON 格式不正确。

  • TypeError:当尝试序列化一个不支持的数据类型时抛出。

6.2 异常处理示例

python 复制代码
import json

json_str = '{"name": "John", "age": 30, "hobbies": ["reading", "traveling"]'
try:
    data = json.loads(json_str)
except json.JSONDecodeError as e:
    print(f"JSON 解码错误:{e}")
except Exception as e:
    print(f"发生错误:{e}")

输出结果:

python 复制代码
JSON 解码错误:Expecting ',' delimiter: line 1 column 46 (char 45)

通过捕获异常,我们可以及时发现并处理问题,避免程序崩溃。

7. 总结

json 库作为 Python 的内置模块,是我们在进行数据存储、传递和交换时不可或缺的工具之一。其为我们提供了简单而强大的工具来处理 JSON 数据。它不仅能够轻松地实现 Python 对象与 JSON 数据之间的相互转换,还提供了丰富的参数和方法来满足各种复杂的需求。我是橙色小博,关注我,一起在人工智能领域学习进步!

相关推荐
像风一样自由20201 分钟前
PyQt5 到 PySide6 技术栈转换详解
开发语言·python·qt
南郁13 分钟前
005-nlohmann/json 基础方法-C++开源库108杰
c++·开源·json
留思难26 分钟前
Python生活手册-NumPy数组创建:从快递分拣到智能家居的数据容器
python·numpy
CodeJourney.28 分钟前
基于DeepSeek与HTML的可视化图表创新研究
数据库·人工智能·信息可视化·excel
小文数模33 分钟前
2025深圳杯东三省数学建模竞赛B题完整分析论文(共27页)(含模型、可运行代码、求解结果)
python·数学建模·matlab
kngines34 分钟前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.3 异常值识别(Z-score法/IQR法/业务规则法)
数据库·postgresql·数据分析·z-score法·iqr法·业务规则法
王嘉俊92544 分钟前
一条 SQL 查询语句是如何执行的(MySQL)
数据库·sql·mysql
cooldream20091 小时前
深入理解 Redis 的主从、哨兵与集群架构
数据库·redis·架构·系统架构师
blackA_1 小时前
数据库MySQL学习——day8(复习与巩固基础知识)
数据库·学习·mysql
IT古董1 小时前
【漫话机器学习系列】234.阈值类特征的方差分析(Thresholding Categorical Feature Variance)
人工智能·python·机器学习