【Python】一文带你了解并使用 Json 模块

简介: python的json模块是python官方提供的一个用于解析和生成JSON数据格式的库。JSON是JavaScript对象表示法(JavaScript Object Notation)的缩写,是一种轻量级的数据交换格式,常被用于Web应用程序中,也被广泛地应用于非Web应用程序中。python的json库可以方便地将python中的数据转换为JSON格式数据,并支持将JSON格式数据转换为python中的数据类型。

本文将详细介绍Python的json模块。


image.png
一、简介
python的json模块是python官方提供的一个用于解析和生成JSON数据格式的库。JSON是JavaScript对象表示法(JavaScript Object Notation)的缩写,是一种轻量级的数据交换格式,常被用于Web应用程序中,也被广泛地应用于非Web应用程序中。python的json库可以方便地将python中的数据转换为JSON格式数据,并支持将JSON格式数据转换为python中的数据类型。

二、发展史
JSON格式最早由Douglas Crockford在2001年提出,不久以后被广泛使用。
目前,JSON格式已成为前后端数据交换的主流格式之一。Python的JSON模块最早于2009年出现在Python 2.6版本中,用于处理json数据格式,提供了对JSON解析和序列化的支持。随着时间的推移,json模块也在后续的版本中得到了改进和扩展,支持了更多的功能和用法,更好地与Python的其他模块集成,如pandas、numpy、requests等。
现在,json模块已经成为python的一个标准库,是开发Python应用不可或缺的重要部分。
三、主要功能详解
1.json.dumps()
json.dumps()是json模块中最常用的函数之一,用于将一个python对象序列化为json编码字符串。函数原型如下:

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表示需要序列化的json对象,其他参数用于控制序列化过程。常用参数解释如下:
参数名 | 含义
------- | -------
skipkeys| 如果遇到某些非法格式的Python数据类型,则抛出TypeError异常。如果skipkeys为True,这些非法格式的数据类型将被跳过,不会引发TypeError异常,默认值为False。
ensure_ascii| 默认True,它保证输出的每个字符都是ASCII字符。如果有些字符不能被编码成ASCII字符,它们会被转义为Unicode转义字符。
indent| 顾名思义,这个参数用于控制缩进格式。如果它的值是一个非负整数,输出的JSON字符串就会分行缩进,而且每次缩进两个空格。如果它的值为None,默认不缩进。

separators| 序列化之后的字符串中不同部分的分隔符。默认为(‘,’, ‘:’)。

sort_keys| 用于指定是否按照键进行排序,默认为False。
示例代码:


import json

data = {
    "name": "张三",
    "age": 18,
    "hobbies": ["reading", "music"],
    "info": {
        "address": "北京市朝阳区",
        "phone": "18888888888"
    }
}

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

输出结果:


{
    "name": "张三",
    "age": 18,
    "hobbies": [
        "reading",
        "music"
    ],
    "info": {
        "address": "北京市朝阳区",
        "phone": "18888888888"
    }
}

2.json.loads()
json.loads()是json模块中另一个常用的函数,用于将一个json编码的字符串解码为python对象。函数原型如下:

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

其中,s表示需要解码的字符串,其他参数用于控制解码过程。常用参数解释如下:
参数名|含义
cls|支持自定义类的解码器,需要继承一个JSONDecoder类并重载其中的decode方法。默认值为None。
object_hook|支持自定义解码过程中的钩子函数,用于控制解码后生成的python对象的格式和类型。对于json串中的每个Python对象,该函数将会被调用一次。默认为None。
object_pairs_hook|类似于object_hook,但是处理的是Python对象而不是Python字典。默认为None。

示例代码:


import json

json_str = '''
{
    "name": "李四",
    "age": 25,
    "hobbies": ["swimming", "playing games"],
    "info": {
        "address": "上海市黄浦区",
        "phone": "16666666666"
    }
}
'''

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

输出结果:


<class 'dict'>
{'name': '李四', 'age': 25, 'hobbies': ['swimming', 'playing games'], 'info': {'address': '上海市黄浦区', 'phone': '16666666666'}}

3.json.load()和json.dump()
如果需要从一个文件中读取json数据或者将数据写入到文件中,则可以使用json.load()和json.dump()函数。其中,json.load()用于从文件中读取json数据,json.dump()用于将json数据写入到文件中。函数原型如下:


json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

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)

其中,fp表示文件指针对象,可以是一个以读模式或写模式打开的文件对象,也可以是一个文件名字符串。其他参数的含义与json.loads()和json.dumps()函数类似,不再赘述。
示例代码:


import json

# 将json数据写入到文件中
data = {
    "name": "王五",
    "age": 30,
    "hobbies": ["travelling", "photography"],
    "info": {
        "address": "广州市天河区",
        "phone": "13666666666"
    }
}
with open('data.json', 'w') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

# 从文件中读取json数据
with open('data.json', 'r') as f:
    data = json.load(f)
    print(type(data))
    print(data)

输出结果:

<class 'dict'>
{'name': '王五', 'age': 30, 'hobbies': ['travelling', 'photography'], 'info': {'address': '广州市天河区', 'phone': '13666666666'}}

4.json.JSONEncoder和json.JSONDecoder
json.JSONEncoder和json.JSONDecoder是json模块中用于自定义json编码和解码过程的类。如果需要将一个自定义类序列化为json字符串或将json字符串反序列化为自定义类对象,则可以通过继承json.JSONEncoder和json.JSONDecoder来实现自定义的转换过程。
示例代码:


import json


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


# 自定义Encoder类
class StudentEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Student):
            return {
                'name': obj.name,
                'age': obj.age,
                'hobbies': obj.hobbies
            }
        else:
            return super().default(obj)


# 自定义Decoder类
class StudentDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        super().__init__(object_hook=self.dict_to_student, *args, **kwargs)

    def dict_to_student(self, d):
        if 'name' in d and 'age' in d and 'hobbies' in d:
            return Student(d['name'], d['age'], d['hobbies'])
        else:
            return d


# 自定义类序列化
student = Student('张三', 18, ['reading', 'music'])
json_str = json.dumps(student, cls=StudentEncoder, ensure_ascii=False, indent=4)
print(json_str)

# 自定义类反序列化
json_str = '''
[
    {
        "name": "张三",
        "age": 18,
        "hobbies": [
            "reading",
            "music"
        ]
    },
    {
        "name": "李四",
        "age": 20,
        "hobbies": [
            "swimming",
            "playing games"
        ]
    }
]
'''
students = json.loads(json_str, cls=StudentDecoder)
print(type(students))
for s in students:
    print(s.__dict__)

输出结果:


{
    "name": "张三",
    "age": 18,
    "hobbies": [
        "reading",
        "music"
    ]
}
<class 'list'>
{'name': '张三', 'age': 18, 'hobbies': ['reading', 'music']}
{'name': '李四', 'age': 20, 'hobbies': ['swimming', 'playing games']}

四、总结
Python的JSON模块是一个内置标准库,是python标准库中不可或缺的一部分,可以方便地将python中的数据转换为JSON格式数据,并支持将JSON格式数据转换为python中的数据类型。同时,json模块也支持自定义转换过程,以满足更加复杂的应用场景。
JSON模块中主要的函数有:dumps()、dump()、loads()和load()。其中dumps()函数将Python内置数据类型转换为JSON字符串,dump()函数将Python内置数据类型转换为JSON格式数据并输出到文件中,loads()函数将JSON字符串转化为Python内置数据类型,load()函数将文件中的JSON格式数据转化为Python内置数据类型。
除此之外,JSON模块中的其他函数还包括:Python对象转化为JSON对象。
在使用JSON模块的过程中,需注意JSON的标准格式。同时,JSON模块在对Python内置数据类型进行解析或者生成数据时,会调用特定对象的 json() 方法,所以在使用JSON模块的时候,需要注意Python对象的定义,尽量满足 json() 方法的调用要求,以实现更好的数据序列化与反序列化效果。

image.png

目录
相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
300 7
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
227 0
|
2月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
5月前
|
JSON API 数据格式
Python采集京东商品评论API接口示例,json数据返回
下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析
|
5月前
|
存储 JSON API
Python与JSON:结构化数据的存储艺术
Python字典与JSON格式结合,为数据持久化提供了便捷方式。通过json模块,可轻松实现数据序列化与反序列化,支持跨平台数据交换。适用于配置管理、API通信等场景,兼具可读性与高效性,是Python开发中不可或缺的数据处理工具。
196 0
|
2月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
353 4
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
258 0
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
177 0
|
3月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南

推荐镜像

更多