超详细JSON教程!那些Python中JSON的使用方式都在这里

在这里插入图片描述

  • 博客主页:长风清留扬-优快云博客
  • 系列专栏:Python基础专栏
  • 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
  • 感谢大家点赞👍收藏⭐评论

在这里插入图片描述

在这里插入图片描述

什么是JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集,但JSON是独立于语言的,很多编程语言都支持JSON格式数据的生成和解析。

JSON的构造

对象(Object)

定义:

  • 对象在JSON中由花括号“{}”括起来。
  • 对象内部由一系列键值对(key-value pair)组成,键值对之间用逗号分隔。

键(Key):

  • 键是一个字符串,必须用双引号括起来。
  • 键名不区分大小写,但通常按照惯例使用小写字母和下划线。

值(Value):

  • 值可以是字符串、数字、布尔值(true/false)、数组、对象或null。
  • 如果值是字符串,则必须用双引号括起来。

结构示例

{  
    "name": "Alice",  
    "age": 30,  
    "city": "New York",  
    "isStudent": false,  
    "skills": ["Python", "Java", "C++"]  
}

数组(Array)

定义:

  • 数组在JSON中由中括号“[]”括起来。
  • 数组内部由一系列值组成,这些值之间用逗号分隔。

值:

  • 数组中的值可以是任何类型,包括字符串、数字、布尔值、数组、对象或null。

结构示例

[  
    "apple",  
    "banana",  
    "cherry",  
    {  
        "name": "Alice",  
        "age": 30  
    },  
    [1, 2, 3, 4, 5]  
]

嵌套结构

定义:

  • JSON允许对象和数组之间互相嵌套,从而构造出复杂的数据结构。

结构示例

{  
    "name": "Bob",  
    "children": [  
        {  
            "name": "Alice",  
            "age": 10  
        },  
        {  
            "name": "Charlie",  
            "age": 7  
        }  
    ],  
    "address": {  
        "street": "123 Main St",  
        "city": "Anytown",  
        "state": "CA"  
    }  
}

注意事项

数据类型:

  • JSON中的数据类型比JavaScript中更为严格,只有字符串、数字、布尔值、数组、对象和null。
  • 字符串必须用双引号括起来,不能使用单引号。

键名唯一性:

  • 在同一个对象中,键名是唯一的,不能重复。

排序:

  • JSON对象中的键值对是无序的,即键名不保证按照插入顺序排列。如果需要有序性,可以在生成JSON字符串时通过指定参数进行排序。

空值:

  • JSON中可以使用null来表示空值或不存在的值。

Json在Python中的对应关系

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

Python中JSON的常用方法

方法名称描述
json.loads()将JSON格式的字符串解析成Python对象(如字典或列表)
json.dumps()将Python对象(如字典或列表)转换成JSON格式的字符串
json.load()从文件中读取JSON格式的数据,并解析成Python对象
json.dump()将Python对象转换成JSON格式的数据,并写入文件
json.JSONDecoder()创建一个JSON解码器对象,用于解析JSON字符串(通常直接使用json.loads()更常见)
json.JSONEncoder()创建一个JSON编码器对象,用于将Python对象转换成JSON字符串(通常直接使用json.dumps()更常见)
json.JSONDecodeError异常类,用于处理JSON解码时发生的错误

json.loads()

json.loads() 是Python标准库 json 模块中的一个函数,用于将JSON格式的字符串解析(解码)成Python对象。这个过程是反序列化的一部分,即将数据从一种格式(在这个情况下是JSON字符串)转换成另一种格式(在这个情况下是Python的数据结构,如字典或列表)。

参数

  • s (str): 要解码的JSON字符串。
  • *, **kwargs: 其他可选参数,用于指定解码行为,如 object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, json_loads 等。这些参数允许用户自定义解码过程,例如将JSON对象转换成特定的Python对象类型。

返回值

Python对象:通常是字典(对应于JSON对象)或列表(对应于JSON数组)。如果JSON字符串表示的是其他类型(如字符串、数字、布尔值、null),则返回相应的Python类型。

示例

import json  
  
# 一个简单的JSON字符串  
json_str = '{"name": "Alice", "age": 30, "is_student": false}'  
  
# 使用json.loads()将JSON字符串解析成Python对象  
python_obj = json.loads(json_str)  
  
# 打印解析后的Python对象  
print(python_obj)  # 输出: {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 访问解析后的对象属性  
print(python_obj['name'])  # 输出: Alice  
print(python_obj['age'])   # 输出: 30  
print(python_obj['is_student'])  # 输出: False

注意事项

  • JSON字符串必须使用双引号(")来包围键和字符串值。如果使用单引号('),则会导致解码错误。
  • JSON中的布尔值 true 和 false 会被转换成Python中的 True 和 False。
  • JSON中的 null 会被转换成Python中的 None。
  • 如果JSON字符串格式不正确(例如缺少引号、括号不匹配等),json.loads() 会抛出一个 json.JSONDecodeError 异常。

json.dumps()

json.dumps() 是Python标准库 json 模块中的一个函数,用于将Python对象编码(序列化)成JSON格式的字符串。这个过程是序列化的一部分,即将数据从一种格式(在这个情况下是Python的数据结构,如字典或列表)转换成另一种格式(在这个情况下是JSON字符串)。

参数

  • obj (any): 要编码的Python对象。它通常是字典(对应于JSON对象)或列表(对应于JSON数组),但也可以是其他类型,如字符串、数字、布尔值、None等。
  • skipkeys (bool, optional): 默认为False。如果字典的键不是基本类型(即str, int, float, bool, None),则设置为True可以跳过这些键;否则将引发TypeError。
  • ensure_ascii (bool, optional): 默认为True。如果设置为False,则尝试将非ASCII字符(如中文)输出为\uXXXX形式的Unicode转义字符之外的字符。请注意,这可能会产生不可读的输出在非ASCII平台的print函数中,因为print函数可能会使用系统默认的编码来解码字节字符串。在Python 3.x中,字符串是Unicode的,所以这个选项主要影响字节字符串的输出。
  • check_circular (bool, optional): 默认为True。如果设置为False,则跳过对容器类型的循环引用的检查(这可能会引发OverflowError)。
  • allow_nan (bool, optional): 默认为True。如果设置为False,则序列化过程中会将浮点数中的NaN、Infinity和-Infinity转换为null。
  • sort_keys (bool, optional): 默认为False。如果设置为True,则字典的键会按照键的Unicode码点排序。
  • indent (int or str, optional): 如果指定为整数,则使用指定的缩进级别来美化输出的JSON字符串。如果指定为字符串(如\t),则使用该字符串作为缩进字符。
  • separators (tuple, optional): 一个(item_separator, key_separator)元组,用于指定分隔符。默认为(', ', ‘: ‘)。如果指定为(’,’, ‘:’),则输出的字符串会更紧凑。
  • default (function, optional): 一个函数,用于将不可序列化的对象转换为一个可序列化的表示。默认情况下,不可序列化的对象会引发TypeError。
    *, **kwargs: 其他可选参数,用于进一步定制序列化行为。

返回值

str: 编码后的JSON格式的字符串。

示例

import json  
  
# 一个简单的Python对象(字典)  
python_obj = {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 使用json.dumps()将Python对象编码成JSON字符串  
json_str = json.dumps(python_obj)  
  
# 打印编码后的JSON字符串  
print(json_str)  # 输出: '{"name": "Alice", "age": 30, "is_student": false}'  
  
# 使用indent参数来美化输出  
pretty_json_str = json.dumps(python_obj, indent=4)  
print(pretty_json_str)  
# 输出:  
# {  
#     "name": "Alice",  
#     "age": 30,  
#     "is_student": false  
# }

注意事项

  • 编码后的JSON字符串使用双引号(")来包围键和字符串值。
  • Python中的布尔值 True 和 False 会被转换成JSON中的 true 和 false。
  • Python中的 None 会被转换成JSON中的 null。
  • 如果Python对象包含无法直接转换成JSON的类型(如自定义对象),则可以使用default参数来提供一个自定义的序列化函数。
  • json.dumps() 不会直接写入文件;要将JSON字符串写入文件,请使用json.dump()方法。

json.load()

json.load() 是Python标准库 json 模块中的一个函数,用于从文件中读取JSON格式的数据,并将其解析(解码)成Python对象。这个过程是反序列化的一部分,即将数据从一种格式(在这个情况下是JSON文件)转换成另一种格式(在这个情况下是Python的数据结构,如字典或列表)。

参数

  • fp (file-like object): 一个文件对象,它应该是一个支持.read()方法的对象,并且包含JSON格式的数据。这通常是一个打开的文件,但也可以是任何实现了文件接口的对象。
  • *, **kwargs: 其他可选参数,用于指定解码行为,如 object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, cls 等。这些参数允许用户自定义解码过程,例如将JSON对象转换成特定的Python对象类型。

返回值

Python对象:通常是字典(对应于JSON对象)或列表(对应于JSON数组)。如果JSON文件表示的是其他类型(如字符串、数字、布尔值、null),则返回相应的Python类型。

示例

import json  
  
# 假设有一个名为'data.json'的文件,内容如下:  
# {  
#     "name": "Alice",  
#     "age": 30,  
#     "is_student": false  
# }  
  
# 打开JSON文件并读取数据  
with open('data.json', 'r', encoding='utf-8') as f:  
    python_obj = json.load(f)  
  
# 打印解析后的Python对象  
print(python_obj)  # 输出: {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 访问解析后的对象属性  
print(python_obj['name'])  # 输出: Alice

注意事项

  • 文件应该以读取模式(‘r’)打开,并且通常应该指定文件的编码(如’utf-8’),以确保正确读取文件中的字符。
  • JSON文件中的字符串必须使用双引号(")来包围键和字符串值。
  • 如果JSON文件格式不正确(例如缺少引号、括号不匹配等),json.load() 会抛出一个 json.JSONDecodeError 异常。
  • json.load() 直接从文件中读取并解析JSON数据,而不需要先将文件内容读入一个字符串变量。

json.dump()

json.dump() 是Python标准库 json 模块中的一个函数,用于将Python对象编码(序列化)成JSON格式,并将结果写入到一个文件中。这个过程是序列化的一部分,即将数据从一种格式(在这个情况下是Python的数据结构,如字典或列表)转换成另一种格式(在这个情况下是JSON文件)。

参数

  • obj (any): 要编码的Python对象。它通常是字典(对应于JSON对象)或列表(对应于JSON数组),但也可以是其他类型,如字符串、数字、布尔值、None等。
  • fp (file-like object): 一个文件对象,它应该是一个支持.write()方法的对象,用于写入JSON格式的数据。这通常是一个打开的文件,但也可以是任何实现了文件接口的对象。
  • skipkeys (bool, optional): 默认为False。如果字典的键不是基本类型(即str, int, float, bool, None),则设置为True可以跳过这些键;否则将引发TypeError。
  • ensure_ascii (bool, optional): 默认为True。如果设置为False,则尝试将非ASCII字符(如中文)输出为\uXXXX形式的Unicode转义字符之外的字符。请注意,在写入文件时,这通常不是问题,因为文件可以保存任何字节。但是,如果文件被当作文本文件处理(例如,在某些编辑器或查看器中打开),则可能需要确保文件的编码与ensure_ascii=False时写入的字符相匹配。
  • check_circular (bool, optional): 默认为True。如果设置为False,则跳过对容器类型的循环引用的检查(这可能会引发OverflowError)。
  • allow_nan (bool, optional): 默认为True。如果设置为False,则序列化过程中会将浮点数中的NaN、Infinity和-Infinity转换为null。
  • sort_keys (bool, optional): 默认为False。如果设置为True,则字典的键会按照键的Unicode码点排序后写入文件。
  • indent (int or str, optional): 如果指定为整数,则使用指定的缩进级别来美化输出的JSON。如果指定为字符串(如\t),则使用该字符串作为缩进字符。
  • separators (tuple, optional): 一个(item_separator, key_separator)元组,用于指定分隔符。默认为(', ', ‘: ‘)。如果指定为(’,’, ‘:’),则输出的字符串会更紧凑。
  • default (function, optional): 一个函数,用于将不可序列化的对象转换为一个可序列化的表示。默认情况下,不可序列化的对象会引发TypeError。
    *, **kwargs: 其他可选参数,用于进一步定制序列化行为。

返回值

None:json.dump() 不返回任何值,它将编码后的JSON数据直接写入到提供的文件对象中。

示例

import json  
  
# 一个简单的Python对象(字典)  
python_obj = {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 打开一个文件以写入JSON数据  
with open('output.json', 'w', encoding='utf-8') as f:  
    json.dump(python_obj, f)  
  
# 现在'output.json'文件包含了编码后的JSON数据

注意事项

  • 文件应该以写入模式(‘w’、‘a’等)打开,并且通常应该指定文件的编码(如’utf-8’),以确保正确写入文件中的字符。
  • 如果ensure_ascii设置为False,并且文件中包含非ASCII字符,请确保文件的编码与这些字符相匹配,否则在某些环境中可能会出现乱码。
  • json.dump() 直接将Python对象编码成JSON格式并写入文件,而不需要先将数据转换成字符串。
  • 如果提供的文件对象不支持.write()方法,json.dump() 会抛出一个异常。

推荐阅读

Python基础

Python全网最全基础课程笔记(一)——基础入门

Python全网最全基础课程笔记(二)——变量

Python全网最全基础课程笔记(三)——所有运算符+运算符优先级

Python全网最全基础课程笔记(四)——基本数据类型

Python全网最全基础课程笔记(五)——选择结构+Python新特性Match

Python全网最全基础课程笔记(六)——循环结构

Python全网最全基础课程笔记(七)——列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(八)——字典,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(九)——集合,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十)——元组,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十一)——字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十二)——函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十三)——作用域,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十四)——异常处理机制,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

有史以来最全的异常类讲解没有之一!爆肝3万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第一部分

有史以来最全的异常类讲解没有之一!第二部分爆肝2万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第二部分

有史以来最全的异常类讲解没有之一!第三部分爆肝4万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第三部分

Python疑难杂症百科-BUG编年史

浮点数精度不再是困扰:Python高手的精准编程秘籍!解决Python浮点数精度问题!

还在为Python变量中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!

还在为Python“运算符”中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!

Python刷题面试宝典

Python列表实战题目练习,巩固知识、检查技术

Python “元组” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python “字符串操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python字典实战题目练习,巩固知识、检查技术

Python “集合” 100道实战题目练习,巩固知识、检查技术

Python “函数” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python “异常处理机制” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Flink入门到就业

2024年最新Flink教程,从基础到就业,大家一起学习–基础篇

2024年最新Flink教程,从基础到就业,大家一起学习–入门篇

2024年最新Flink教程,从基础到就业,大家一起学习–Flink集群部署

2024年最新Flink教程,从基础到就业,大家一起学习–flink部署和集群部署(从本地测试到公司生产环境如何部署项目源码)

2024年最新Flink教程,从基础到就业,大家一起学习–Flink运行架构底层源码详解+实战

2024年最新Flink教程,从基础到就业,大家一起学习–Flink DataStream API-第一篇+源码讲解

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长风清留扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值