python-json

一、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 的数据结构基于两种基本结构:

  1. 键值对集合(对象 / Object)
  2. 值的有序列表(数组 / 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.dumpsjson.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

相关推荐
Spliceㅤ2 小时前
项目:基于qwen的点餐系统
开发语言·人工智能·python·机器学习·自然语言处理
asdzx672 小时前
使用 Python 快速为 PDF 添加背景色或背景图片
python·pdf
badhope2 小时前
Docker入门到实战全攻略
linux·python·docker·github·matplotlib
huabiangaozhi3 小时前
spring-boot-starter和spring-boot-starter-web的关联
前端
华研前沿标杆游学3 小时前
2026深圳企业参访-走进深圳华星光电TCL学习智能制造
python
umeelove353 小时前
Spring boot整合quartz方法
java·前端·spring boot
dapeng28703 小时前
Python异步编程入门:Asyncio库的使用
jvm·数据库·python
小码哥_常3 小时前
Android 开发探秘:View.post()为何能获取View宽高
前端
爱学习的程序媛3 小时前
【Web前端】WebAssembly详解
前端·web·wasm
2401_851272993 小时前
Python面向对象编程(OOP)终极指南
jvm·数据库·python