来自wetab 的AI pro:
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是它使用了类似于编程语言(特别是JavaScript)的习惯。因此,这种格式非常流行在网络应用中用于数据交互。
JSON是由多种类型的值组成:
- 对象(Object):对象在JSON中表示为一系列键值对(“key”: value),被大括号
{}
包围。每个键(key)是一个字符串,每个值(value)可以是字符串、数字、数组、真/假值或者另一个对象。 - 数组(Array):数组是一系列值(value),被方括号
[]
包围,值之间用逗号分隔。 - 值(Value):值可以是字符串、数字、对象、数组、布尔值(true/false)或者 null。
示例 JSON 数据
{
"person": {
"name": "John Doe",
"age": 30,
"isStudent": false,
"skills": ["Python", "JavaScript"],
"address": {
"street": "123 Elm St",
"city": "Somewhere"
}
}
}
在这个示例中:
- “person” 是一个对象,包含了五个键值对:
name
,age
,isStudent
,skills
, 和address
。 - “skills” 是一个数组,包含了两个字符串值。
- “address” 是一个嵌套对象,包含了
street
和city
两个键。
如何使用 Python 处理 JSON
Python 支持 JSON 通过 json
库,允许你解析 JSON 字符串及文件,并可以将内部数据结构变回 JSON 格式。
以下是基于上述 JSON 示例的处理代码:
import json
# JSON 字符串
json_string = '''
{
"person": {
"name": "John Doe",
"age": 30,
"isStudent": false,
"skills": ["Python", "JavaScript"],
"address": {
"street": "123 Elm St",
"city": "Somewhere"
}
}
}
'''
# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_string)
# 访问数据
name = data['person']['name']
age = data['person']['age']
skills = data['person']['skills']
city = data['person']['address']['city']
print(f"Name: {name}, Age: {age}, City: {city}")
print("Skills:", skills)
# 添加一个新的技能
data['person']['skills'].append("R")
# 将 Python 字典转换回 JSON 字符串
updated_json = json.dumps(data, indent=4)
print("Updated JSON:")
print(updated_json)
这个代码段展示了如何从一个 JSON 字符串读取数据,怎样访问和修改数据,以及如何将修改后的数据写回到 JSON 格式。dumps()方法:将Python对象序列化为JSON字符串。
进一步的,将上面的json_string保存为一个json文件并从文件读取内容,然后将['person']['name']的值改为"Tom",再次保存json文件:
import json
# JSON 字符串
json_string = '''
{
"person": {
"name": "John Doe",
"age": 30,
"isStudent": false,
"skills": ["Python", "JavaScript"],
"address": {
"street": "123 Elm St",
"city": "Somewhere"
}
}
}
'''
# 将字符串保存到 JSON 文件
with open('data.json', 'w') as file:
file.write(json_string)
# 从文件读取 JSON 数据
with open('data.json', 'r') as file:
data = json.load(file)
# 修改name的值
data['person']['name'] = "Tom"
# 将更新后的数据保存回 JSON 文件
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
# 打印输出以验证更改
print(json.dumps(data, indent=4))
indent=4
表示每一层数据前将插入四个空格作为缩进。这使得生成的 JSON 数据结构清晰,方便人类阅读和调试。如果不设这个参数,上述数据的打印结果是:{"person": {"name": "Tom", "age": 30, "isStudent": false, "skills": ["Python", "JavaScript"], "address": {"street": "123 Elm St", "city": "Somewhere"}}}。设定缩进后:- {
"person": {
"name": "Tom",
"age": 30,
"isStudent": false,
"skills": [
"Python",
"JavaScript"
],
"address": {
"street": "123 Elm St",
"city": "Somewhere"
}
}
}
如果数据文本包含中文,需要注意编码方式的设置
demo:data.json
{
"人员": {
"姓名": "张三",
"年龄": 30,
"学生": false,
"技能": ["Python", "JavaScript"],
"地址": {
"街道": "五一路38号楼",
"城市": "某地"
}
}
}
调用的脚本:
# encoding: utf-8
# JSON调用含中文demo
import json
with open('data.json', 'r', encoding='utf-8') as file: # 使用utf-8编码处理中文
data = json.load(file) # 加载数据
data['人员']['年龄'] = 90 # 修改数据
file.close()
with open('data.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4) # 将数据写回json文件,不使用ascii转义符
file.close()
with open('data.json', 'r', encoding='utf-8') as file: # 再次打开文件,验证数据
data = json.load(file) # 加载数据
file.close()
print(data) # 打印数据
执行结果:
{'人员': {'姓名': '张三', '年龄': 90, '学生': False, '技能': ['Python', 'JavaScript'], '地址': {'街道': '五一路38号楼', '城市': '某地'}}}
注意,ensure_ascii=False的含义写文件的时候是不使用ascii转义符。ensure_ascii的默认值是True,那么汉字存储为json文件后的显示就不是“人员”、“姓名”这样,而是类似"\u59d3\u540d",如果需要手动修改json文件的内容就会很不方便。
json.dumps()和 json.dump()的区别:
json.dumps()
和 json.dump()
是 Python 标准库中 json
模块提供的两个函数,都是用于将 Python 对象序列化为 JSON 格式的字符串。不过,这两个函数在使用上有些不同,主要区别在于它们的输出方式和用途。
-
json.dumps():
- 目的:将 Python 对象转换为 JSON 格式的字符串。
- 返回值:返回一个表示 JSON 数据的字符串。
- 用法示例:
import json data = {'key': 'value'} json_string = json.dumps(data) print(json_string) # 输出:{"key": "value"}
- 此函数通常用于需要JSON格式的字符串,比如在打印、日志记录或通过网络发送数据等场合。
-
json.dump():
- 目的:将 Python 对象转化为 JSON 格式,并将其写入到一个 file-like Object(比如文件对象)中。
- 返回值:没有返回值,直接将 JSON 数据写入提供的 file-like Object。
- 用法示例:
import json data = {'key': 'value'} with open('data.json', 'w') as f: json.dump(data, f) # 上述代码将 data 字典保存到 data.json 文件中,文件内容为:{"key": "value"}
- 此函数通常用于需要将数据保存到文件中的场合。
总结一下:
- 使用
json.dumps()
需要将得到的字符串自行处理(比如打印或存储)。 - 使用
json.dump()
直接将数据写入到文件或其他类文件对象中。
两者在参数设定(如缩进格式 indent
,排序 sort_keys
等)方面是类似的,可以根据需要灵活选择。
json.load()
和 json.loads()
的区别:
json.load()
和 json.loads()
也是 Python 标准库中 json
模块提供的两个函数,用于将 JSON 格式的字符串或从文件中加载出来的 JSON 数据反序列化为 Python 对象。这两个函数的主要区别同样在于它们的输入源和用途。
-
json.loads():
- 目的:将 JSON 格式的字符串转换为 Python 的数据结构。
- 参数:一个 JSON 字符串。
- 返回值:Python 的数据类型(如字典、列表、字符串、数值等)。
- 用法示例:
import json json_string = '{"key": "value"}' data = json.loads(json_string) print(data) # 输出:{'key': 'value'}
- 这个函数通常用于处理内存中的 JSON 字符串,如从网络接口接收的数据。
-
json.load():
- 目的:读取一个 file-like Object(文件对象或任何支持文件接口的对象)中的 JSON 数据,转换为 Python 的数据结构。
- 参数:一个打开的文件对象或者任何类似文件的对象,该对象包含了 JSON 文档内容。
- 返回值:Python 的数据类型(如字典、列表等)。
- 用法示例:
import json with open('data.json', 'r') as f: data = json.load(f) print(data) # 假设 data.json 文件中包含 {"key": "value"},输出:{'key': 'value'}
- 这个函数通常用于从文件中读取 JSON 数据。
总结一下:
json.loads()
专用于将 JSON 的字符串解码成 Python 对象。json.load()
专用于读取文件中的 JSON 数据,并将其转换成 Python 对象。
这两个函数都用于从 JSON 数据“加载”或“解码”,但输入的形式不同,json.loads()
输入是字符串,而 json.load()
输入则是文件或文件类对象。
进一步的综合了解二者的区别:
# encoding: utf-8
import json
# dumps()和dump()的区别:
json_dict = { # python格式的字典
"人员": {
"姓名": "张三",
"年龄": 30,
"学生": False,
"技能": ["Python", "JavaScript"],
"地址": {
"街道": "五一路38号楼",
"城市": "某地"
}
}
}
with open('data_obj.json', 'w', encoding='utf-8') as file:
json.dump(json_dict, file, ensure_ascii=False, indent=4) # dump():将json格式的python对象(本例是字典)写入json文件
file.close()
json_str = json.dumps(json_dict, ensure_ascii=False) # dumps():将python格式的对象(本例是字典)转换成json格式的字符串
with open('data_str.json', 'w', encoding='utf-8') as file:
json.dump(json_str, file, ensure_ascii=False, indent=4) # 将json格式的python对象(json格式的字符串)写入json文件
file.close()
with open('data_obj.json', 'r', encoding='utf-8') as file:
data = json.load(file) # 从json文件中加载到的内容,注意这个是用python对象格式存储的
print("data_obj.json的格式是:", type(data), "\n", "内容为:", data)
file.close()
with open('data_str.json', 'r', encoding='utf-8') as file:
data = json.load(file) # 从json文件中加载到的内容,注意这个是用json格式的字符串格式存储的
print("data_str.json的格式是:", type(data), "\n", "内容为:", data)
file.close()
data_dumped = json.loads(data) # 从文本还原成python对象
print("还原后的对象的格式是:", type(data_dumped), "\n", "内容为:", data_dumped)
"""
data_obj.json的格式是: <class 'dict'>
内容为: {'人员': {'姓名': '张三', '年龄': 30, '学生': False, '技能': ['Python', 'JavaScript'], '地址': {'街道': '五一路38号楼', '城市': '某地'}}}
data_str.json的格式是: <class 'str'>
内容为: {"人员": {"姓名": "张三", "年龄": 30, "学生": false, "技能": ["Python", "JavaScript"], "地址": {"街道": "五一路38号楼", "城市": "某地"}}}
还原后的对象的格式是: <class 'dict'>
内容为: {'人员': {'姓名': '张三', '年龄': 30, '学生': False, '技能': ['Python', 'JavaScript'], '地址': {'街道': '五一路38号楼', '城市': '某地'}}}
"""
利用定义变量的方法改变jison的值:
原始json文件的内容如下:
{
"person": {
"name": {
"tom": {
"phone number": {
"first number": ["123456"],
"second number": ["234567"]
}
},
"jack": {
"phone number": {
"first number": ["666666"],
"second number": ["888888"]
}
}
}
}
}
# encoding: utf-8
import json
with open('../JSON/setting.json', 'r', encoding='utf-8') as file:
json_data = json.load(file)
print(json.dumps(json_data, indent=4))
tom = json_data["person"]["name"]["tom"] # 定义变量
tom_1st_phone = tom["phone number"]["first number"] # 定义变量
print(tom_1st_phone)
tom_1st_phone[0] = '000000' # 改变变量
print(json.dumps(json_data, indent=4))
with open('../JSON/setting.json', 'w') as file: # 保存文件
json.dump(json_data, file, indent=4)
执行结果:
{
"person": {
"name": {
"tom": {
"phone number": {
"first number": [
"123456"
],
"second number": [
"234567"
]
}
},
"jack": {
"phone number": {
"first number": [
"666666"
],
"second number": [
"888888"
]
}
}
}
}
}
['123456']
{
"person": {
"name": {
"tom": {
"phone number": {
"first number": [
"000000"
],
"second number": [
"234567"
]
}
},
"jack": {
"phone number": {
"first number": [
"666666"
],
"second number": [
"888888"
]
}
}
}
}
}