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

发布于:2025-02-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

在这里插入图片描述

  • 博客主页:长风清留扬-CSDN博客
  • 系列专栏: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中的对应关系

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

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-第一篇+源码讲解

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到