JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。JSON易于人阅读和编写,同时也易于机器解析和生成。
JSON格式的基本结构是基于两种类型的值:
简单值:这些包括字符串、数字、布尔值(true 或 false)、null、JSON数组(由方括号 [] 包围的值的列表)和JSON对象(由大括号 {} 包围的键值对的列表)。
复合值:JSON对象和JSON数组可以用来组合简单值和复合值以创建更复杂的数据结构。
JSON对象
JSON对象是一个无序的键值对集合,其中每个键都是一个字符串,每个值都可以是一个简单值或另一个JSON对象或JSON数组。
{
"key1": "value1",
"key2": 123,
"key3": true,
"key4": null,
"key5": [1, 2, 3],
"key6": {
"nestedKey1": "nestedValue1",
"nestedKey2": "nestedValue2"
}
}
JSON数组
JSON数组是一个有序的值列表,用方括号包围。数组中的每个值都可以是一个简单值或另一个JSON对象或JSON数组。
[
"value1",
123,
true,
null,
{
"key1": "value1",
"key2": "value2"
},
[1, 2, 3]
]
字符串
JSON中的字符串必须使用双引号(")包围,而不是单引号(')。
{
"name": "John Doe",
"greeting": "Hello, world!"
}
数字
JSON支持整数和浮点数。
{
"age": 30,
"score": 9.8
}
布尔值
JSON中的布尔值只能是 true 或 false。
{
"isStudent": true,
"hasGraduated": false
}
Null
JSON中的 null 值表示空或不存在的值。
{
"address": null
}
JSON格式简洁清晰,易于阅读和编写,因此在Web开发中广泛用作前后端数据交换的格式。在Python、JavaScript、Java、C#等许多编程语言中都有现成的库或函数来处理JSON数据的编码(序列化)和解码(反序列化)。
在Python中,json模块是用于处理JSON数据的标准库。你可以使用它来将Python对象编码(或序列化)成JSON格式的字符串,也可以将JSON格式的字符串解码(或反序列化)成Python对象。以下是json模块的一些基本用法示例:
编码(序列化)
将Python对象(如字典、列表、字符串、数字等)转换为JSON格式的字符串。
import json
# Python字典
data = {
"name": "John",
"age": 30,
"city": "New York"
}
# 使用json.dumps()将Python对象编码为JSON字符串
json_string = json.dumps(data)
print(json_string)
# 输出: {"name": "John", "age": 30, "city": "New York"}
# 你可以使用参数来定制输出的JSON字符串,比如缩进以增加可读性
pretty_json_string = json.dumps(data, indent=4)
print(pretty_json_string)
# 输出:
# {
# "name": "John",
# "age": 30,
# "city": "New York"
# }
解码(反序列化)
将JSON格式的字符串转换为Python对象(如字典、列表等)。
import json
# JSON字符串
json_string = '{"name": "John", "age": 30, "city": "New York"}'
# 使用json.loads()将JSON字符串解码为Python对象
data = json.loads(json_string)
print(data)
# 输出: {'name': 'John', 'age': 30, 'city': 'New York'}
# 你可以看到解码后的数据是一个Python字典
print(type(data))
# 输出:
# 如果JSON字符串表示一个数组,解码后将得到Python列表
json_array_string = '[1, 2, 3, "four"]'
data_array = json.loads(json_array_string)
print(data_array)
# 输出: [1, 2, 3, 'four']
写入文件
将Python对象编码为JSON格式,并写入到文件中。
import json
data = {
"name": "John",
"age": 30,
"city": "New York"
}
# 使用with语句打开文件,并将数据写入到文件中
with open('data.json', 'w') as f:
json.dump(data, f)
从文件读取
从文件中读取JSON数据,并解码为Python对象。
import json
# 使用with语句打开文件,并读取数据
with open('data.json', 'r') as f:
data = json.load(f)
print(data)
# 输出: {'name': 'John', 'age': 30, 'city': 'New York'}
错误处理
当处理JSON数据时,可能会遇到格式错误或无法序列化的对象。为了避免程序崩溃,你可以使用try和except语句来捕获可能抛出的异常。
import json
try:
# 尝试解码一个格式错误的JSON字符串
data = json.loads('{"name": "John", "age": "thirty"}')
except json.JSONDecodeError as e:
print(f"解码错误: {e}")
try:
# 尝试序列化一个无法序列化的对象,如包含datetime的复杂对象
complex_data = {"name": "John", "timestamp": datetime.datetime.now()}
json.dumps(complex_data)
except TypeError as e:
print(f"序列化错误: {e}")
在使用json模块时,确保你的数据是可以被序列化的,并且JSON字符串的格式是正确的,否则你可能会遇到错误。