JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式,在包括 Python 在内的多种编程语言中广受欢迎。凭借其简洁的语法和对复杂数据结构的表达能力,JSON 已成为现代 Web 开发的核心要素,为从 API 到客户端 Web 应用的一切提供支持。
在本教程中,我将带您了解在 Python 中使用 JSON 的基础知识,包括序列化、反序列化、读写 JSON 文件、格式化等。完成本教程后,您将能够:
理解 JSON 的优势与劣势
识别 JSON 的使用场景并与常见替代方案进行比较
在 Python 中高效地序列化与反序列化 JSON 数据
在 Python 编程语言中处理 JSON 数据
使用 `json` 库在 Python 中格式化 JSON 数据
在处理 JSON 数据时优化性能
在 API 开发中管理 JSON 数据。
什么是 JSON?
JSON(JavaScript 对象表示法)是一种轻量且与语言无关的数据交换格式,被众多编程语言和框架广泛采用与支持。当您需要一种简单、易读、支持复杂数据结构且可在不同程序之间轻松共享的格式时,JSON 是理想选择。
JSON 的典型用例是需要在基于 Web 的应用之间交换数据,例如您在网站上填写表单并将信息发送到服务器进行处理时。
在这种场景下,JSON 非常合适,因为它轻量高效,比 XML 等格式占用更少的带宽和存储空间。此外,JSON 支持嵌套对象和数组等复杂数据结构,便于在不同系统间表示与交换结构化数据。JSON 的其他一些用例包括:
应用程序编程接口(API)。 JSON 常用于构建 API(应用程序编程接口),以便不同系统和应用相互通信。例如,许多基于 Web 的 API 使用 JSON 作为数据交换格式,便于与不同编程语言和平台集成。
配置文件。 JSON 为存储和检索配置数据提供了简单易读的格式。这可以包括应用的设置,如用户界面布局或用户偏好。
物联网(IoT)。 物联网设备常常生成大量数据,使用 JSON 可以更高效地在传感器和其他设备之间存储与传输这些数据。
JSON 数据示例
python_obj = {
"name" : "John Doe" ,
"age" : 30 ,
"email" : "[email protected] " ,
"is_employee" : True ,
"hobbies" : [
"reading" ,
"playing soccer" ,
"traveling"
] ,
"address" : {
"street" : "123 Main Street" ,
"city" : "New York" ,
"state" : "NY" ,
"zip" : "10001"
}
}
print ( python_obj) 技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
在此示例中,我们有一个表示某个人的 JSON 对象。该对象包含多个属性:name、age、email 和 is_employee。hobbies 属性是一个包含三个字符串的数组。address 属性自身是一个对象,包含如 street、city、state 和 zip 等属性。
请注意,JSON 数据通常由一系列键值对组成,其中键以字符串表示,值可以是字符串、数字、布尔值、数组或对象等多种类型。
使用 JSON 的优缺点
下面我们挑选了一些使用 JSON 的优点与不足。
处理 JSON 文件的优点:
JSON 的主要优势包括:
轻量且易读。 JSON 文件易于阅读和理解,即使对非技术用户也是如此。同时它很轻量,便于在互联网上传输。
良好的互操作性: JSON 文件具有良好的互操作性,能够在不同系统和平台之间轻松交换。这是因为 JSON 是广泛支持的标准格式,许多应用和服务使用 JSON 进行数据交换。因此,使用 JSON 文件可以更容易地整合系统的不同部分,或在不同应用之间共享数据。
易于校验: JSON 文件可以基于模式(schema)轻松进行校验,以确保其符合特定的结构或规则集。这有助于及早发现数据中的错误和不一致,从而节省时间并避免后续问题。JSON 模式还可用于自动生成 JSON 文件中数据的文档。
处理 JSON 文件的缺点:
对复杂数据结构的支持有限: 虽然 JSON 文件支持多种数据类型,但并不适合存储如图或树等复杂数据结构。这会使使用 JSON 处理某些数据类型变得困难。
无强制模式: JSON 文件不强制任何模式,这意味着可能在 JSON 文件中存储不一致或无效的数据。这会导致依赖该数据的应用出现错误和缺陷。
查询与索引能力有限: JSON 文件无法像传统数据库那样提供同等水平的查询与索引能力。这会使在大型 JSON 文件中执行复杂搜索或检索特定数据子集变得困难。
高效数据交换的 JSON 替代方案
有多种可用于数据交换或存储的 JSON 替代方案,各自有其优缺点。常见替代方案包括:
XML(可扩展标记语言)。 XML 使用标签定义元素、使用属性描述数据。它比 JSON 更冗长,但在模式校验和文档结构方面支持强大。
YAML(Yet Another Markup Language)。 YAML 是一种面向人类可读的数据序列化格式,设计为易读易写。它比 XML 更简洁,并支持复杂数据类型和注释。
MessagePack。 MessagePack 是一种二进制序列化格式,设计得比 JSON 更紧凑高效。它支持复杂数据类型,适合在低带宽网络中传输数据。
Protocol Buffers。 Protocol Buffers 是 Google 开发的二进制序列化格式,旨在实现高效率,并对模式校验提供强力支持,非常适合大规模分布式系统。
BSON(二进制 JSON)。 BSON 是扩展了 JSON 的二进制序列化格式,增加了数据类型和效率优化。它为 MongoDB 数据库中的高效数据存储与传输而设计。
选择数据交换格式取决于具体用例和应用需求。由于其简单、通用、广泛采用,JSON 仍是热门选择,但在某些用例下,XML、YAML、MessagePack、Protocol Buffers 和 BSON 可能更为合适。
处理 JSON 数据的 Python 库
有几种常用的 Python 包可用于处理 JSON 文件:
json。 内置的 Python 包,提供编码和解码 JSON 数据的方法。
simplejson。 提供快速的 JSON 编码器与解码器,并支持 Python 特定类型。
ujson。 一款超快的 Python JSON 编码与解码库。
jsonschema。 提供将 JSON 数据与指定模式进行校验的能力。
JSON 的序列化与反序列化
JSON 序列化与反序列化是将 JSON 数据与其他格式(如 Python 对象或字符串)相互转换以便传输或存储的过程。
序列化是将对象或数据结构转换为 JSON 字符串的过程。为了以其他系统或程序可读取的格式传输或存储数据,这一步是必要的。JSON 序列化在 Web 开发中很常见,数据经常在不同系统或应用之间传输。
另一方面,反序列化是将 JSON 字符串转换回对象或数据结构的过程。为了在程序或系统中使用数据,这一步同样必要。JSON 反序列化通常用于 Web 开发中解析来自 API 或其他来源的数据。
从 Web 开发到数据分析乃至更多场景,JSON 的序列化与反序列化都是处理 JSON 数据的重要技术。许多编程语言都提供了内置库或包,使序列化与反序列化变得简单高效。
以下是 json 库中用于序列化与反序列化的一些常用函数。
1. json.dumps()
此函数用于将 Python 对象序列化为 JSON 字符串。dumps() 函数接收一个参数(Python 对象),并返回一个 JSON 字符串。示例如下:
import json
python_obj = { 'name' : 'John' , 'age' : 30 }
json_string = json. dumps( python_obj)
print ( json_string)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
2. json.loads()
此函数用于将 JSON 字符串解析为 Python 对象。loads() 函数接收一个参数(JSON 字符串),并返回一个 Python 对象。示例如下:
import json
json_string = '{"name": "John", "age": 30}'
python_obj = json. loads( json_string)
print ( python_obj)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
3. json.dump()
此函数用于将 Python 对象序列化并写入 JSON 文件。dump() 函数接收两个参数:Python 对象和文件对象。示例如下:
import json
python_obj = { 'name' : 'John' , 'age' : 30 }
with open ( 'data.json' , 'w' ) as file :
json. dump( python_obj, file )
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
4. json.load()
此函数用于读取 JSON 文件并将其内容解析为 Python 对象。load() 函数接收一个参数(文件对象),并返回一个 Python 对象。示例如下:
import json
with open ( 'data.json' , 'r' ) as file :
python_obj = json. load( file )
print ( python_obj)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
Python 与 JSON 的数据类型不同,Python 提供的类型更为广泛。Python 能存储如集合(set)和字典(dict)等复杂数据结构,而 JSON 仅能处理字符串、数字、布尔值、数组和对象。来看一些差异:
Python
JSON
dict
Object
list
Array
tuple
Array
str
String
int
Number
float
Number
True
true
False
false
None
null
Python 列表转 JSON
要将 Python 列表转换为 JSON 格式,您可以使用 json 库中的 json.dumps() 方法。
import json
my_list = [ 1 , 2 , 3 , "four" , "five" ]
json_string = json. dumps( my_list)
print ( json_string)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
在此示例中,我们有一个名为 my_list 的列表,包含整数和字符串的混合。然后使用 json.dumps() 方法将该列表转换为 JSON 格式的字符串,并将其存储在变量 json_string 中。
格式化 JSON 数据
在 Python 中, json.dumps() 函数提供了用于格式化和排序 JSON 输出的选项。常用选项包括:
1. Indent
该选项指定输出 JSON 字符串的缩进空格数。例如:
import json
data = {
"name" : "John" ,
"age" : 30 ,
"city" : "New York"
}
json_data = json. dumps( data, indent= 2 )
print ( json_data)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
2. Sort_keys
该选项指定是否按字母顺序对输出 JSON 字符串中的键进行排序。例如:
import json
data = {
"name" : "John" ,
"age" : 30 ,
"city" : "New York"
}
json_data = json. dumps( data, sort_keys= True )
print ( json_data)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
3. Separators
该选项允许您指定输出 JSON 字符串所用的分隔符。separators 参数接收一个包含两个字符串的元组,第一个字符串用于 JSON 对象键值对之间的分隔符,第二个字符串用于 JSON 数组中各项之间的分隔符。例如:
import json
data = {
"name" : "John" ,
"age" : 30 ,
"city" : "New York"
}
json_data = json. dumps( data, separators= ( "," , ":" ) )
print ( json_data)
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
Python 示例——API 中的 JSON 数据
import requests
import json
url = "https://jsonplaceholder.typicode.com/posts"
response = requests. get( url)
if response. status_code == 200 :
data = json. loads( response. text)
print ( data)
else :
print ( f"Error retrieving data, status code: { response. status_code} " )
技术支持 示例学习编辑器,按 Tab 键进入。按 Escape 键然后按 Tab 或 Shift+Tab 导航退出。
格式化输出:
此代码使用 Python 中的 requests 库和 json 库向 URL "https://jsonplaceholder.typicode.com/posts" 发起请求并获取数据。requests.get(url) 这一行发起实际请求,并将响应存储在 response 变量中。
代码中的 if response.status_code == 200: 用于检查响应码是否为 200,即请求成功。若请求成功,代码随后使用 json.loads() 方法将响应文本 加载为 Python 字典,并存入变量 data。
如果您想进一步了解该主题,请参阅我们的教程 Web API、Python Requests 与在 Python 中执行 HTTP 请求 。
在 Python 中优化 JSON 性能
在 Python 中处理大量 JSON 数据时,优化代码性能以确保高效运行非常重要。以下是一些优化 JSON 性能的建议:
使用 cjson 或 ujson 库。 这些库比 Python 标准 JSON 库更快,能显著提升 JSON 序列化与反序列化的性能。
避免不必要的转换。 在 Python 对象与 JSON 数据之间来回转换会带来性能开销。如有可能,尽量直接处理 JSON 数据,避免不必要的转换。
对大规模 JSON 数据使用生成器。 在处理大量 JSON 数据时,使用生成器有助于降低内存占用并提升性能。
尽量减少网络开销。 在网络上传输 JSON 数据时,尽量减少传输的数据量可提升性能。可在传输前使用 gzip 等压缩技术减小 JSON 数据体积。
使用缓存。 如果您频繁访问相同的 JSON 数据,通过缓存可减少加载数据的请求次数,从而提升性能。
优化数据结构: JSON 数据的结构也会影响性能。相比复杂、深度嵌套的结构,更简单、扁平的结构通常更高效。
JSON 格式的局限性
虽然 JSON 在许多应用中是常用的数据交换格式,但仍需注意一些实现层面的局限:
对某些数据类型支持不足。 JSON 对二进制数据、日期和时间等类型的原生支持有限。虽然可以通过变通方式在 JSON 中表示这些类型,但会使序列化与反序列化更复杂。
不支持注释。 与 YAML 和 XML 等格式不同,JSON 不支持注释。这会增加在 JSON 数据中添加注释以提供上下文或文档的难度。
扩展的灵活性有限。 虽然 JSON 可通过自定义属性或 $schema 属性进行扩展,但其在扩展方面并不如 XML 或 YAML 那样灵活。
无保留键顺序的标准。 JSON 没有标准化的对象键顺序保留方式,这会使比较或合并 JSON 对象更困难。
对循环引用支持有限。 JSON 对对象自引用(循环引用)的支持有限,这会使某些数据结构难以用 JSON 表示。
在处理 JSON 数据时,了解这些实现局限性非常重要,以确保该格式适合您的需求,并避免在序列化、反序列化和数据表示方面可能出现的问题。
结论
JSON 是现代 Web 开发中多功能且广泛使用的数据交换格式,而 Python 提供了一套强大的工具来处理 JSON 数据。无论您是在构建 API,还是在开发客户端 Web 应用,理解 Python 中 JSON 的基础都是现代开发者的必备技能。掌握本教程中介绍的技巧,您就能熟练处理 Python 中的 JSON 数据,并构建健壮、可扩展的应用,充分发挥这一强大数据交换格式的优势。
如果您想学习如何构建流水线以导入常见存储格式的数据,请查看我们的 使用 pandas 精简数据摄取 课程。您将使用 pandas(Python 主流分析库)从多种来源获取数据,包括调查问卷表格、公共服务请求数据库以及热门点评网站的 API。
JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式,在包括 Python 在内的多种编程语言中广受欢迎。凭借其简洁的语法和对复杂数据结构的表达能力,JSON 已成为现代 Web 开发的核心要素,为从 API 到客户端 Web 应用的一切提供支持。
在本教程中,我将带您了解在 Python 中使用 JSON 的基础知识,包括序列化、反序列化、读写 JSON 文件、格式化等。完成本教程后,您将能够:
什么是 JSON?
JSON(JavaScript 对象表示法)是一种轻量且与语言无关的数据交换格式,被众多编程语言和框架广泛采用与支持。当您需要一种简单、易读、支持复杂数据结构且可在不同程序之间轻松共享的格式时,JSON 是理想选择。
JSON 的典型用例是需要在基于 Web 的应用之间交换数据,例如您在网站上填写表单并将信息发送到服务器进行处理时。
在这种场景下,JSON 非常合适,因为它轻量高效,比 XML 等格式占用更少的带宽和存储空间。此外,JSON 支持嵌套对象和数组等复杂数据结构,便于在不同系统间表示与交换结构化数据。JSON 的其他一些用例包括:
JSON 数据示例
在此示例中,我们有一个表示某个人的 JSON 对象。该对象包含多个属性:name、age、email 和 is_employee。hobbies 属性是一个包含三个字符串的数组。address 属性自身是一个对象,包含如 street、city、state 和 zip 等属性。
请注意,JSON 数据通常由一系列键值对组成,其中键以字符串表示,值可以是字符串、数字、布尔值、数组或对象等多种类型。
使用 JSON 的优缺点
下面我们挑选了一些使用 JSON 的优点与不足。
处理 JSON 文件的优点:
JSON 的主要优势包括:
处理 JSON 文件的缺点:
高效数据交换的 JSON 替代方案
有多种可用于数据交换或存储的 JSON 替代方案,各自有其优缺点。常见替代方案包括:
选择数据交换格式取决于具体用例和应用需求。由于其简单、通用、广泛采用,JSON 仍是热门选择,但在某些用例下,XML、YAML、MessagePack、Protocol Buffers 和 BSON 可能更为合适。
处理 JSON 数据的 Python 库
有几种常用的 Python 包可用于处理 JSON 文件:
JSON 的序列化与反序列化
JSON 序列化与反序列化是将 JSON 数据与其他格式(如 Python 对象或字符串)相互转换以便传输或存储的过程。
序列化是将对象或数据结构转换为 JSON 字符串的过程。为了以其他系统或程序可读取的格式传输或存储数据,这一步是必要的。JSON 序列化在 Web 开发中很常见,数据经常在不同系统或应用之间传输。
另一方面,反序列化是将 JSON 字符串转换回对象或数据结构的过程。为了在程序或系统中使用数据,这一步同样必要。JSON 反序列化通常用于 Web 开发中解析来自 API 或其他来源的数据。
从 Web 开发到数据分析乃至更多场景,JSON 的序列化与反序列化都是处理 JSON 数据的重要技术。许多编程语言都提供了内置库或包,使序列化与反序列化变得简单高效。
以下是
json库中用于序列化与反序列化的一些常用函数。1. json.dumps()
此函数用于将 Python 对象序列化为 JSON 字符串。dumps() 函数接收一个参数(Python 对象),并返回一个 JSON 字符串。示例如下:
2. json.loads()
此函数用于将 JSON 字符串解析为 Python 对象。loads() 函数接收一个参数(JSON 字符串),并返回一个 Python 对象。示例如下:
3. json.dump()
此函数用于将 Python 对象序列化并写入 JSON 文件。dump() 函数接收两个参数:Python 对象和文件对象。示例如下:
4. json.load()
此函数用于读取 JSON 文件并将其内容解析为 Python 对象。load() 函数接收一个参数(文件对象),并返回一个 Python 对象。示例如下:
Python 与 JSON 的数据类型不同,Python 提供的类型更为广泛。Python 能存储如集合(set)和字典(dict)等复杂数据结构,而 JSON 仅能处理字符串、数字、布尔值、数组和对象。来看一些差异:
Python
JSON
dict
Object
list
Array
tuple
Array
str
String
int
Number
float
Number
True
true
False
false
None
null
Python 列表转 JSON
要将 Python 列表转换为 JSON 格式,您可以使用 json 库中的
json.dumps()方法。在此示例中,我们有一个名为 my_list 的列表,包含整数和字符串的混合。然后使用 json.dumps() 方法将该列表转换为 JSON 格式的字符串,并将其存储在变量 json_string 中。
格式化 JSON 数据
在 Python 中,
json.dumps()函数提供了用于格式化和排序 JSON 输出的选项。常用选项包括:1. Indent
该选项指定输出 JSON 字符串的缩进空格数。例如:
2. Sort_keys
该选项指定是否按字母顺序对输出 JSON 字符串中的键进行排序。例如:
3. Separators
该选项允许您指定输出 JSON 字符串所用的分隔符。separators 参数接收一个包含两个字符串的元组,第一个字符串用于 JSON 对象键值对之间的分隔符,第二个字符串用于 JSON 数组中各项之间的分隔符。例如:
Python 示例——API 中的 JSON 数据
格式化输出:
此代码使用 Python 中的
requests库和json库向 URL "https://jsonplaceholder.typicode.com/posts" 发起请求并获取数据。requests.get(url)这一行发起实际请求,并将响应存储在response变量中。代码中的
if response.status_code == 200:用于检查响应码是否为 200,即请求成功。若请求成功,代码随后使用 json.loads() 方法将响应文本加载为 Python 字典,并存入变量 data。如果您想进一步了解该主题,请参阅我们的教程 Web API、Python Requests 与在 Python 中执行 HTTP 请求。
在 Python 中优化 JSON 性能
在 Python 中处理大量 JSON 数据时,优化代码性能以确保高效运行非常重要。以下是一些优化 JSON 性能的建议:
cjson或ujson库。 这些库比 Python 标准 JSON 库更快,能显著提升 JSON 序列化与反序列化的性能。JSON 格式的局限性
虽然 JSON 在许多应用中是常用的数据交换格式,但仍需注意一些实现层面的局限:
在处理 JSON 数据时,了解这些实现局限性非常重要,以确保该格式适合您的需求,并避免在序列化、反序列化和数据表示方面可能出现的问题。
结论
JSON 是现代 Web 开发中多功能且广泛使用的数据交换格式,而 Python 提供了一套强大的工具来处理 JSON 数据。无论您是在构建 API,还是在开发客户端 Web 应用,理解 Python 中 JSON 的基础都是现代开发者的必备技能。掌握本教程中介绍的技巧,您就能熟练处理 Python 中的 JSON 数据,并构建健壮、可扩展的应用,充分发挥这一强大数据交换格式的优势。
如果您想学习如何构建流水线以导入常见存储格式的数据,请查看我们的 使用 pandas 精简数据摄取 课程。您将使用 pandas(Python 主流分析库)从多种来源获取数据,包括调查问卷表格、公共服务请求数据库以及热门点评网站的 API。