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

news2024/11/19 3:45:57

 

作者主页:爱笑的男孩。的博客_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 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() 方法的调用要求,以实现更好的数据序列化与反序列化效果。

 ​​​​​​​

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【历史上的今天】6 月 13 日:分组交换网路的“亲子纠纷”;博弈论创始人出生;交互式电视初现雏形

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 13 日&#xff0c;知名的 ENIAC 建造者约翰莫克利在历史上的这一天参观了 ABC 计算机&#xff0c;与 ABC 的设计者之一阿塔纳索夫会面。这次会面后来牵扯…

java发送QQ邮箱验证码实现登录注册、邮箱验证码防刷校验

文章目录 一&#xff1a;前台功能实现1.1 页面编写1.2 发送验证码——sendEmailCode1.2.1 远程调用发送接口1.2.1 接口防刷校验——60s内只能发送一次 二&#xff1a;获取QQ邮箱授权码2.1 登录QQ邮箱2.2 开启SMTP权限2.2.1 设置2.2.2 账户2.2.3 管理服务2.2.4 生成授权码2.2.5 …

新能源商用车:老玩家、新势力“争先恐后”

现如今&#xff0c;作为重要出行交通工具之一的汽车&#xff0c;已经在人们日常生活中扮演着愈发重要的角色。不仅如此&#xff0c;汽车行业也发生了不小的变化&#xff0c;新能源汽车的热度更是居高不下。除了各路玩家积极布局之外&#xff0c;新能源汽车的销量也是持续走高。…

python---列表和元组(1)

变量就是内存空间,用来表示/存储数据. 如果表示的数据少,直接定义几个变量就行了. 但是有的时候表示的数据比较多,就很麻烦 在python中就有列表和元组,就是这样的机制,可以用一个变量表示很多的数据. 这就类比于其他编程语言中的"数组" 列表和元组大部分的功能是差…

智安网络|深谈网络安全难点的根源和解决之道

随着数字化和网络化的加速发展&#xff0c;人们面临的网络安全问题日益增多。由于网络安全威胁的多样性和复杂性&#xff0c;网络安全防护变得越来越困难。本文将从几个方面来探讨网络安全难点的根源和解决之道。 一. 网络安全威胁的复杂性 网络安全威胁种类繁多&#xff0c;主…

Junit执行器Runner探索之旅 | 京东云技术团队

单元测试是每个程序员必备的技能&#xff0c;而Runner是每个单元测试类必有属性。本文通过解读Junit源码&#xff0c;介绍junit中每个执行器的使用方法&#xff0c;让读者在单元测试时&#xff0c;可以灵活的使用Runner执行器。 一、背景 在今年的敏捷团队建设中&#xff0c;…

07 lvgl-边框样式

void lv_100ask_demo_course_2_1_1(void){ static lv_style_t style;lv_style_init(&style);/*Set a background color and a radius*/lv_style_set_radius(&style, 5); //半径lv_style_set_bg_opa(&style, LV_OPA_COVER); //透明度lv_style_set_bg_color(&st…

xlsx是什么格式的文件?xlsx文件删除了怎么恢复

如果您在工作中不小心删除了重要的xlsx文件怎么办&#xff1f;xlsx文件删除了怎么恢复&#xff1f;本文将介绍如何在不同情况下恢复xlsx文件的实用技巧&#xff0c;帮助您有效的找回文件。 第一部分&#xff1a;xlsx是什么格式的文件 XLSX是一种电子表格文件格式&#xff0c;…

JAVA 实现 Redis 发布订阅

Redis 发布订阅 发布订阅&#xff1a;消息发布者发布消息 和 消息订阅者接收消息&#xff0c;两者之间通过某种媒介联系起来 例如订杂志&#xff0c;当自己订阅了爱格杂志&#xff0c;每个月会发刊一本。到发布的时候派送员将杂志送到自己手上就能看到杂志内容。只有我们订阅了…

为什么美颜插件比传统集成方式更快?

都说云市场插件快&#xff0c;快在哪里呢&#xff1f; 美颜功能是实时互动应用的基础功能&#xff0c;广泛应用在社交、直播、约会、会议等场景&#xff0c;开发者们往往在集成美颜功能时候非常头疼。今天&#xff0c;我们来介绍云市场美颜插件相比传统的裸数据集成方式快在哪…

Unity与原生交互之Unity篇——AndroidStudio导出aar/jar包供Unity使用实现交互全流程(2)

序言:此篇介绍在(1)的基础上引入Unity的API库进行交互,原生调Unity 1.导入Unity库 注意: (1)老版本Unity的classes.jar里包含UnityPlayerActivity API (2)新版本Unity的UnityPlayerActivity API 在UnityEditor安装路径中,需单独导入,后续介绍 1.1导入unity的classes.jar …

Seesion会话超时时间测试-业务安全测试实操(3)

Seesion会话超时时间测试, Cookie仿冒测试, 密文比对认证测试 本地加密传输测试-业务安全测试实操(2)_luozhonghua2000的博客-CSDN博客 测试原理和方法 在用户成功登录系统获得Session认证会话后,该Session认证会话应具有生命周期,即用户在成功登录系统后,如果在固定时间内…

反汇编逆向实战——扫雷辅助制作

一、编程前准备 刚开始是预备知识&#xff0c;如果熟悉的话&#xff0c;可以直接跳到第二部分阅读 在 Windows API 中&#xff0c;SetTimer 函数用于创建一个定时器&#xff0c;并在指定的时间间隔后触发一个定时器消息。以下是关于 SetTimer 函数的介绍&#xff1a; 功能&a…

接口文档设计注意事项

接口名称清晰 一般接口url要求能看得出接口的作用。比如说&#xff0c;查询用户信息&#xff08;queryUserInfo&#xff09;&#xff0c;就是一个不错的接口名称。 接口地址完整 接口的地址&#xff0c;也叫接口的URL地址。即别人调用你的接口&#xff0c;用的是什么URL。比…

【Unity Shader】入门到惊叹(1)基本概念:什么是网格?材质?Shader?

文章目录 一、什么是网格(Mesh)?二、什么是MeshFilter(网格过滤器)?三、什么是MeshRenderer(网格渲染器)?四、什么是材质(Material)?五、什么是Shader(着色器)?一、什么是网格(Mesh)? 如图,模型的三角形面就叫做网格(Mesh),它的本质是一堆顶点数据的规则排…

华为OD机试真题 JavaScript 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生…

医械围城的觉醒时刻:从“乱世枭雄” 到“剩者为王”

我们现在看到医疗器械行业其实非常的热&#xff0c;不管是投资&#xff0c;还是创业&#xff0c;还有各种跨界进来打劫想分一杯羹的。 但是这个行业是不是一个围城&#xff1f; 真的是进来就可以捡钱吗&#xff1f; 在一片繁荣的景象下&#xff0c;企业的发展存在什么风险&a…

STM32FreeRTOS操作系统移植

移植好的FreeRTOS模板&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1_87VQAWXUl4jTqSCZ0MFjw?pwddw52 提取码&#xff1a;dw52 1.在工程中新建FreeRTOS文件夹 2.把源码source里面的文件全部粘贴进FreeRTOS文件夹中 3.在portable文件中只保留一下文件&#xff0c;…

【剑指offer刷题记录 java版】数组双指针 之 二分搜索

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 二分搜索 剑指 Offer 53 - I. 在排序数组中查找数字 I剑指 Offer II 068. 查找插入位置剑指 Offer 04. 二维数组中的查找剑指 Offer II 069. 山峰数组的顶部剑指 Offer II 073. …

java周期性线程池newScheduledThreadPool介绍,多线程下载url文件(断点下载、进度展示、网速展示、剩余时间展示)

文章目录 一&#xff1a;newScheduledThreadPool&#xff08;周期性线程池&#xff09;1.1 特点1.2 核心线程数1.3 创建实例1.4 常用方法1.4.1 schedule方法1.4.2 scheduleAtFixedRate方法1.4.3 scheduleWithFixedDelay方法 二&#xff1a;多线程下载展示文件总大小、剩余时间、…