一、json和json格式
JSON是JavaScript Object Notation的缩写,是一种轻量级的文本数据交换格式,独立于语言且支持不同编程语言。
1.1、JSON 语法规则
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号 , 分隔
- 使用斜杆 \ 来转义字符
- 大括号 {} 保存对象
- 中括号 [] 保存数组,数组可以包含多个对象
1.2、JSON 支持的数据类型(value)
| 数据类型 | 示例 | 说明 |
|---|---|---|
| 字符串(String) | "Hello" |
必须用 双引号,不能是单引号 |
| 数字(Number) | 123, -45, 3.14, 1e+10 |
整数或浮点数,支持科学计数法 |
| 布尔值(Boolean) | true, false |
表示逻辑真或假 |
| null | null |
表示空值或无值 |
| 对象(Object) | { "name": "Tom", "age": 20 } |
键值对的集合,无序 |
| 数组(Array) | [1, 2, 3, "four"] |
值的有序列表,可以是不同类型 |
1.3、Json数据结构
JSON 的数据结构基于两种基本结构:
- 键值对集合(对象 / Object)
- 值的有序列表(数组 / Array)
对象(Object) :无序的键值对集合,用 {} 包裹,键必须是双引号包裹的字符串 ,键值用 : 分隔,键值对之间用 , 分隔。
- 用
{ }包裹 - 内部是 键值对(key-value pairs)
- key 必须是字符串,且必须用双引号括起来
- key 和 value 之间用
:分隔 - 多个键值对之间用
,分隔(但最后一个不能有逗号)
json
#一个简单的json格式数据
{
"aaa":"bbb",
"ccc":"ddd"
}
#json嵌套数据
{
"segments":{
"segment":{
"stat_xys":"2025-09-16T02:12:15Z",
"json_num":1,
"end_stat":[
"长沙火车站test",
123
],
"json_arry":[
{
"json1":"aa"
},
{
"json2":"bb"
}
],
"json_obj":{
"dad":"adf"
},
"json_null":null,
"json_boolean":false
}
}
}
数组(Array) :有序的值列表,用 [] 包裹,值之间用 , 分隔。
- 用
[ ]包裹 - 内部是值的列表,可以是任意 JSON 支持的数据类型(数字、字符串、对象、数组等)
- 多个元素之间用
,分隔
json
[
1,
"two",
false,
null,
{
"name":"Tom"
},
[
10,
20
],
[
{
"aa":"dd"
},
{
"as":"dad"
}
]
]
二、json模块
2.1数据类型转换
将数据从Python转换到json格式,在数据类型上会有变化,如下表所示:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float | number |
| True | true |
| False | false |
| None | null |
反过来,将json格式转化为python内置类型,如下表所示:
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number(int) | int |
| number(real) | float |
| true | True |
| false | False |
| null | None |
2.2、使用方法
json模块主要方法:
| 方法 | 功能 |
|---|---|
json.dumps(obj) |
将python数据类型转换为json格式的字符串。 |
json.dump(obj, fp) |
将python数据类型转换并保存到json格式的文件内。 |
json.loads(s) |
将json格式的字符串转换为python的类型。 |
json.load(fp) |
从json格式的文件中读取数据并转换为python的类型。 |
2.2.1 json.dumps()
python
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- 功能:将Python对象编码成JSON字符串。
- 常用参数:
- obj:要序列化的Python对象。
- skipkeys:为True时,字典的key如果不是基本类型(str、int、float、bool、None)会被跳过,默认False。
- ensure_ascii:默认为True,所有非ASCII字符会被转义。比如中文会被转义。
- indent:指定缩进的字符数,常用于美化输出,默认None。
- separators:指定分隔符,默认(', ', ': ')。
- sort_keys:为True时,字典按key排序,默认False。
python
py_obj1 = [1, "two", "中文", False, None, {"name": "Tom"}, [10, 20], [{"aa": "dd"}, {"as": "dad"}]]
py_obj2 = {"segments": {
"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1, "end_stat": ["长沙火车站test", 123],
"json_arry": [{"json1": "aa"}, {"json2": "bb"}], "json_obj": {"dad": "adf"}, "json_null": None,
"json_boolean": False}}}
# 因为是dict类型,所以单引号或者双引号都可以。但是转换成的json字符串,只能是双引号
py_obj3 = {"aaa": 'bbb', 'ccc': "ddd"}
py2json3 = json.dumps(py_obj3)
print("将类型从", type(py_obj3), "转换为", type(py2json3), "转换后的值为", py2json3)
py2json2 = json.dumps(py_obj2)
print("将类型从", type(py_obj2), "转换为", type(py2json2), "转换后的值为", py2json2)
py2json1 = json.dumps(py_obj1)
print("将类型从", type(py_obj1), "转换为", type(py2json1), "转换后的值为", py2json1)
将类型从 <class 'dict'> 转换为 <class 'str'> 转换后的值为 {
"aaa": "bbb",
"ccc": "ddd"
}
将类型从 <class 'dict'> 转换为 <class 'str'> 转换后的值为 {"segments": {"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1, "end_stat": ["长沙火车站test", 123], "json_arry": [{"json1": "aa"}, {"json2": "bb"}], "json_obj": {"dad": "adf"}, "json_null": null, "json_boolean": false}}}
将类型从 <class 'list'> 转换为 <class 'str'> 转换后的值为 [1, "two", "\u4e2d\u6587", false, null, {"name": "Tom"}, [10, 20], [{"aa": "dd"}, {"as": "dad"}]]
2.2.2json.dump()
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- 功能:将Python对象编码成JSON格式并写入文件。
- 参数同dumps,新增:
- fp:文件类对象(有write方法)。
python
py_obj1 = [1, "two", "中文", False, None, {"name": "Tom"}, [10, 20], [{"aa": "dd"}, {"as": "dad"}]]
py_obj2 = {"segments": {
"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1, "end_stat": ["长沙火车站test", 123],
"json_arry": [{"json1": "aa"}, {"json2": "bb"}], "json_obj": {"dad": "adf"}, "json_null": None,
"json_boolean": False}}}
# 因为是dict类型,所以单引号或者双引号都可以。但是转换成的json字符串,只能是双引号
py_obj3 = {"aaa": 'bbb', 'ccc': "ddd"}
with open('py2json3.json', 'w', encoding='utf-8') as f:
json.dump(py_obj3, f, ensure_ascii=False, indent=2)
with open('py2json2.json', 'w', encoding='utf-8') as f:
json.dump(py_obj2, f, ensure_ascii=False, indent=None)
with open('py2json1.json', 'w', encoding='utf-8') as f:
json.dump(py_obj1, f, ensure_ascii=False, indent=None)
结果生成三个文件,分别为py2json3.json、py2json2.json、py2json1.json。文件内容与dumps相同
2.2.3. json.loads()
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 功能:将JSON字符串解码为Python对象。
- 常用参数:
- s:JSON格式字符串。
- object_hook:自定义对象解码函数,用于将字典转换为自定义Python对象。
- cls:自定义解码器类,必须是JSONDecoder的子类。
- parse_float:解析JSON数字为浮点数时使用的函数,默认使用float()。
- parse_int:解析JSON数字为整数时使用的函数,默认使用int()。
- parse_constant:解析JSON特殊值(如-Infinity, Infinity, NaN)的函数。
- object_pairs_hook:类似object_hook,但接收的是有序键值对列表而非字典。
python
py_obj1 = [1, "two", "中文", False, None, {"name": "Tom"}, [10, 20], [{"aa": "dd"}, {"as": "dad"}]]
py_obj2 = {"segments": {
"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1, "end_stat": ["长沙火车站test", 123],
"json_arry": [{"json1": "aa"}, {"json2": "bb"}], "json_obj": {"dad": "adf"}, "json_null": None,
"json_boolean": False}}}
# 因为是dict类型,所以单引号或者双引号都可以。但是转换成的json字符串,只能是双引号
py_obj3 = {"aaa": 'bbb', 'ccc': "ddd"}
py2json3 = json.dumps(py_obj3)
py2json2 = json.dumps(py_obj2)
py2json1 = json.dumps(py_obj1)
json2py3 = json.loads(py2json3)
print("将类型从", type(py2json3), "转换为", type(json2py3), "转换后的值为", json2py3)
json2py2 = json.loads(py2json2)
print("将类型从", type(py2json2), "转换为", type(json2py2), "转换后的值为", json2py2)
json2py1 = json.loads(py2json1)
print("将类型从", type(py2json1), "转换为", type(json2py1), "转换后的值为", json2py1)、
输出结果为:
将类型从 <class 'str'> 转换为 <class 'dict'> 转换后的值为 {'aaa': 'bbb', 'ccc': 'ddd'}
将类型从 <class 'str'> 转换为 <class 'dict'> 转换后的值为 {'segments': {'segment': {'stat_xys': '2025-09-16T02:12:15Z', 'json_num': 1, 'end_stat': ['长沙火车站test', 123], 'json_arry': [{'json1': 'aa'}, {'json2': 'bb'}], 'json_obj': {'dad': 'adf'}, 'json_null': None, 'json_boolean': False}}}
将类型从 <class 'str'> 转换为 <class 'list'> 转换后的值为 [1, 'two', '中文', False, None, {'name': 'Tom'}, [10, 20], [{'aa': 'dd'}, {'as': 'dad'}]]
2.2.4. json.load()
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 功能:从文件读取JSON数据并解码为Python对象。
- 参数同loads,新增:
- fp:文件类对象。
python
py_obj1 = [1, "two", "中文", False, None, {"name": "Tom"}, [10, 20], [{"aa": "dd"}, {"as": "dad"}]]
py_obj2 = {"segments": {
"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1, "end_stat": ["长沙火车站test", 123],
"json_arry": [{"json1": "aa"}, {"json2": "bb"}], "json_obj": {"dad": "adf"}, "json_null": None,
"json_boolean": False}}}
# 因为是dict类型,所以单引号或者双引号都可以。但是转换成的json字符串,只能是双引号
py_obj3 = {"aaa": 'bbb', 'ccc': "ddd"}
with open('py2json3.json', 'w', encoding='utf-8') as f:
json.dump(py_obj3, f, ensure_ascii=False, indent=2)
with open('py2json2.json', 'w', encoding='utf-8') as f:
json.dump(py_obj2, f, ensure_ascii=False, indent=None)
with open('py2json1.json', 'w', encoding='utf-8') as f:
json.dump(py_obj1, f, ensure_ascii=False, indent=None)
with open('py2json3.json', 'r', encoding='utf-8') as f:
json2py3 = json.load(f)
print("将json文件py2json3.json中的数据转换为", type(json2py3), "转换后的值为", json2py3)
with open('py2json2.json', 'r', encoding='utf-8') as f:
json2py2 = json.load(f)
print("将json文件py2json2.json中的数据转换为", type(json2py2), "转换后的值为", json2py2)
with open('py2json1.json', 'r', encoding='utf-8') as f:
json2py1 = json.load(f)
print("将json文件py2json1.json中的数据转换为", type(json2py1), "转换后的值为", json2py1)
输出结果为:
将json文件py2json3.json中的数据转换为 <class 'dict'> 转换后的值为 {'aaa': 'bbb', 'ccc': 'ddd'}
将json文件py2json2.json中的数据转换为 <class 'dict'> 转换后的值为 {'segments': {'segment': {'stat_xys': '2025-09-16T02:12:15Z', 'json_num': 1, 'end_stat': ['长沙火车站test', 123], 'json_arry': [{'json1': 'aa'}, {'json2': 'bb'}], 'json_obj': {'dad': 'adf'}, 'json_null': None, 'json_boolean': False}}}
将json文件py2json1.json中的数据转换为 <class 'list'> 转换后的值为 [1, 'two', '中文', False, None, {'name': 'Tom'}, [10, 20], [{'aa': 'dd'}, {'as': 'dad'}]]
json.dumps和json.dump写入文件的区别:
- dump() 不需要使用
.write()方法,只需要写那个字典,那个文件即可;而 dumps() 需要使用.write()方法写入。 - 如果把字典写到文件里面的时候,dump()好用;但是如果不需要操作文件,或需要把内容存储到数据库何excel,则需要使用dumps()先把字典转换成字符串,再写入
json.load() 和 json.loads() 区别:
- loads() 传的是json字符串,而 load() 传的是文件对象
- 使用 loads() 时需要先读取文件在使用,而 load() 则不用
总结:不管是dump还是load,带s的都是和字符串相关的,不带s的都是和文件相关的
2.3、json 的其他方法
除了上述常用的 dumps()、loads()、dump() 和 load() 方法外,json 库还提供了一些其他方法和常量,用于处理特殊情况。
json.JSONEncoder:自定义JSON编码器,继承并重写default方法可实现自定义对象序列化json.JSONDecoder:自定义JSON解码器。用于扩展json.loads等解码行为,通常无需自定义。json.JSONDecodeError:当解析 JSON 数据出错时,会抛出这个异常,我们可以使用它来进行错误处理。
2.3.1、自定义对象的序列化与反序列化
在实际开发中,我们可能会遇到需要序列化自定义对象的情况。默认情况下,json 库无法直接序列化自定义对象,但我们可以自定义一个编码器来实现这个功能。
python
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
return super().default(obj)
person = Person("John", 30)
json_str = json.dumps(person, cls=PersonEncoder)
print(json_str)
输出结果为:
{"name": "John", "age": 30}
我们可以看到通过,自定义编码器,成功将自定义的 Person 对象序列化为 JSON 字符串。同样地,我们也可以通过自定义解码器来实现 JSON 字符串到自定义对象的反序列化。
2.3.2、json 库的异常处理
常用的错误类型有两类:
json.JSONDecodeError:当解析 JSON 数据出错时抛出,例如 JSON 格式不正确。TypeError:当尝试序列化一个不支持的数据类型时抛出。
python
import json
json_str = '{"name": "John", "age": 30, "hobbies": ["reading", "traveling"]'
try:
data = json.loads(json_str)
except json.JSONDecodeError as e:
print(f"JSON 解码错误:{e}")
except Exception as e:
print(f"发生错误:{e}")
输出结果为:
JSON 解码错误:Expecting ',' delimiter: line 1 column 64 (char 63)
三、python解析json
3.1、解析JSON字符串
python
import json
#定义一个json对象
json_str = '{"segments": {"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1,"end_stat": ["长沙火车站test", 123], "json_arry": [{"json1": "aa"},{"json2":"bb"}],"json_obj": {"dad": "adf"}, "json_null": null,"json_boolean": false}}}'
print(json_str)
print(type(json_str))
print('-' * 20)
# 将json对象转换为Python对象
python_obj = json.loads(json_str)
print(python_obj)
print(type(python_obj))
print('-' * 20)
# 定位具体的数据节点
print(python_obj.keys())
print(python_obj.values())
print(python_obj["segments"]["segment"]["json_arry"][0]["json1"])
print(python_obj["segments"]["segment"]["json_obj"])
print(python_obj["segments"]["segment"]["end_stat"][0])
输出结果:
{"segments": {"segment": {"stat_xys": "2025-09-16T02:12:15Z", "json_num": 1,"end_stat": ["长沙火车站test", 123], "json_arry": [{"json1": "aa"},{"json2":"bb"}],"json_obj": {"dad": "adf"}, "json_null": null,"json_boolean": false}}}
<class 'str'>
--------------------
{'segments': {'segment': {'stat_xys': '2025-09-16T02:12:15Z', 'json_num': 1, 'end_stat': ['长沙火车站test', 123], 'json_arry': [{'json1': 'aa'}, {'json2': 'bb'}], 'json_obj': {'dad': 'adf'}, 'json_null': None, 'json_boolean': False}}}
<class 'dict'>
--------------------
dict_keys(['segments'])
dict_values([{'segment': {'stat_xys': '2025-09-16T02:12:15Z', 'json_num': 1, 'end_stat': ['长沙火车站test', 123], 'json_arry': [{'json1': 'aa'}, {'json2': 'bb'}], 'json_obj': {'dad': 'adf'}, 'json_null': None, 'json_boolean': False}}])
aa
{'dad': 'adf'}
长沙火车站test
3.2、解析JSON文件
file.json文件格式如下:
json
{
"segments":{
"segment":{
"stat_xys":"2025-09-16T02:12:15Z",
"json_num":1,
"end_stat":[
"长沙火车站test",
123
],
"json_arry":[
{
"json1":"aa"
},
{
"json2":"bb"
}
],
"json_obj":{
"dad":"adf"
},
"json_null":null,
"json_boolean":false
}
}
}
python
import json
import os
# 1、JSON文件转换为Python对象。
with open(os.path.join(os.getcwd(), "file.json"), "r", encoding="UTF-8") as f:
python_obj = json.load(f)
print(python_obj)
print(type(python_obj))
print('-' * 20)
# 2、定位具体的数据节点
print(python_obj.keys())
print(python_obj.values())
print(python_obj["segments"]["segment"]["json_arry"][0]["json1"])
print(python_obj["segments"]["segment"]["json_obj"])
print(python_obj["segments"]["segment"]["end_stat"][0])
输出结果:
{'segments': {'segment': {'stat_xys': '2025-09-16T02:12:15Z', 'json_num': 1, 'end_stat': ['长沙火车站test', 123], 'json_arry': [{'json1': 'aa'}, {'json2': 'bb'}], 'json_obj': {'dad': 'adf'}, 'json_null': None, 'json_boolean': False}}}
<class 'dict'>
--------------------
dict_keys(['segments'])
dict_values([{'segment': {'stat_xys': '2025-09-16T02:12:15Z', 'json_num': 1, 'end_stat': ['长沙火车站test', 123], 'json_arry': [{'json1': 'aa'}, {'json2': 'bb'}], 'json_obj': {'dad': 'adf'}, 'json_null': None, 'json_boolean': False}}])
aa
{'dad': 'adf'}
长沙火车站test
3.3、json解析封装
file.json文件内容如下:
json
{
"user1":{"name":"tom","password":"123123"},
"user2":{"name":"jon","password":"123456"}
}
python
import json
import os
def parse_json(file, key1, key2):
parse_json_list = []
with open(file, "r", encoding="UTF-8") as f:
data = json.load(f)
for i in data:
parse_json_list.append((data[i][key1], data[i][key2]))
return parse_json_list
if __name__ == '__main__':
info = parse_json(os.path.join(os.getcwd(), "file.json"), "name", "password")
print(info)
执行结果如下:
[('tom', '123123'), ('jon', '123456')]
3.4、json文件转换为xml文件
https://blog.csdn.net/liyue121100132/article/details/153697442
3.5、xml文件转换为json文件
https://blog.csdn.net/liyue121100132/article/details/153697442
参考文档:https://blog.csdn.net/m0_47311097/article/details/148367076