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

news/2024/11/15 3:27:38/

 

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?type=blog个人简介:打工人。

持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。

如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com 

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

 

目录

一、简介

二、发展史

三、主要功能详解

        1. json.dumps()

        2. json.loads()

        3. json.load()和json.dump()

        4. json.JSONEncoder和json.JSONDecoder

四、总结


一、简介

        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 jsondata = {"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 jsonjson_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 jsonclass Student:def __init__(self, name, age, hobbies):self.name = nameself.age = ageself.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() 方法的调用要求,以实现更好的数据序列化与反序列化效果。

 ​​​​​​​

 


http://www.ppmy.cn/news/360177.html

相关文章

【深度学习】0-0 NumPy基础知识

NumPy的主要特点 ndarray&#xff0c;快速&#xff0c;节省空间的多维数组&#xff0c;提供数组化的算术运算和高级的广播功能 导入NumPy NumPy是外部库。首先要导人NumPy库。 import numpy as np NumPy数组 生成NumPy数组&#xff0c;使用np.array()&#xff0c;接收Python列…

如何使用ArcGIS加载历史影像

历史影像对研究地物的变化可以产生很直观的效果&#xff0c;Esri提供了在线浏览的历史影像&#xff0c;这里给大家介绍一下如何将这个历史影像加载到ArcGIS&#xff0c;希望能对你有所帮助。 获取地图链接 打开地图网站&#xff08;https://livingatlas.arcgis.com/wayback/&a…

谈谈FileWriter

FileWriter 的使用方法 使用 FileWriter 写入文件需要以下步骤&#xff1a; 创建 FileWriter 对象&#xff0c;指定要写入的文件路径。使用 write(String str) 方法将数据写入文件中。关闭 FileWriter 对象。 以下是一个简单的 FileWriter 示例代码&#xff1a; import java.i…

J2EE1

企业级开发应用平台&#xff0c;主要的框架有StrutsSpringHibernate等主要框架。 J2EE是一套全然不同于传统应用开发的技术架构&#xff0c;包含许多组件&#xff0c;主要可简化且规范应用系统的开发与部署&#xff0c;进而提高可移植性、安全与再用价值。 J2EE核心是一组技术…

IDM2022最新版极速下载工具

IDM可提升你的下载速度多达5倍&#xff0c;安排下载时程&#xff0c;或续传一半的软件。 IDM 声称可以提升您的下载速度高达 5 倍&#xff0c;可以支持断点续传&#xff0c;可让你自动下载指定类型的文件&#xff0c;还可以支持多线程下载&#xff0c; 其 in-speed 技术还会动…

idm+百度下载助手解决百度网盘限速

一.idm下载安装(博主预先安装chrome 浏览器) Internet Download Manager 支持所有流行的浏览器&#xff0c;包括&#xff1a;Microsoft Internet Explorer, Netscape, MS N Explorer, AOL, Opera, Mozilla, Mozilla Firefox, Mozilla Firebird, Avant Browser, MyIE2, Google …

j2ee02

Set的特点&#xff1a;无序、对象不能重复 打印出来的并不是按照添加顺序展示出来的 添加相同数据时只会展示出一个 ​​​​​​​ ​​​​​​​ ​​​​​​​ Set的遍历&#xff1a;foreach和迭代器 因为无序无下标所以不可以用下标循环遍历 常用…

myeclipse安装maven2

网友总结以及自己的经验如下&#xff1a; 第一种方法&#xff1a; windows -> preferences -> myeclipse -> maven4Eclipse -> maven 将update maven projects on startup 打上勾&#xff0c;&#xff08;myeclipse 6.5&#xff09; 第二种方法。 需要安装的…