python实战:使用json序列化

一,官方文档:

https://docs.python.org/zh-cn/3/library/json.html

二,json与字典的相互转化

1,字典转json字符串

1
2
3
4
5
6
7
import json
 
# 字典转json
d = dict(name='Tom', age=2, score=88)
json_d = json.dumps(d)
print(type(json_d))
print(json_d)

运行结果:

<class 'str'>
{"name": "Tom", "age": 2, "score": 88}

2,json字符串转字典

1
2
3
4
5
6
7
import json
 
# json转字典
json_c = '{"name": "Tom", "age": 2, "score": 88}'
c = json.loads(json_c)
print(type(c))
print(c)

运行结果:

<class 'dict'>
{'name': 'Tom', 'age': 2, 'score': 88}

三,json与类实例的相互转化

1,通过dataclass把自定义类型的实例转为字典,再转为json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import json
from dataclasses import dataclass, asdict
 
@dataclass
class Student:
    name:str
    age:int
    score:int
 
s = Student('Tom', 2, 88)
print(s)      # Student(name='Tom', age=2, score=88)
# 将自定义类转换为字典
custom_dict = asdict(s)
print(type(custom_dict))      # <class 'dict'>
print(custom_dict)      # {'name': 'Tom', 'age': 2, 'score': 88}
json_str = json.dumps(custom_dict)
print(json_str)     # {"name": "Tom", "age": 2, "score": 88}

运行结果:

Student(name='Tom', age=2, score=88)
<class 'dict'>
{'name': 'Tom', 'age': 2, 'score': 88}
{"name": "Tom", "age": 2, "score": 88}

2,把实例通过__dict__转换为字典,再转为json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import json
 
 
class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
 
s = Student('Tom', 2, 88)
json_s = json.dumps(s, default=lambda obj: obj.__dict__)
print("__dict__转来的字典:",json_s)      # {"name": "Tom", "age": 2, "score": 88}
json_s2 = json.dumps(s.__dict__)
print("__dict__转来的字典2:",json_s)      # {"name": "Tom", "age": 2, "score": 88}

运行结果:

__dict__转来的字典: {"name": "Tom", "age": 2, "score": 88}
__dict__转来的字典2: {"name": "Tom", "age": 2, "score": 88}

3,通过定义函数把实例转为字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import json
 
 
class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
 
# 定义把类转为字典的函数
def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }
 
 
s = Student('Tom', 2, 88)
json_s = json.dumps(s, default=student2dict)
print(json_s)

运行结果:

{"name": "Tom", "age": 2, "score": 88}

4,通过定义函数把字典转为实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import json
 
 
class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
 
 
def dict2student(d):
    return Student(d['name'], d['age'], d['score'])
 
 
json_str = '{"name": "Tom", "age": 2, "score": 88}'
stu = json.loads(json_str, object_hook=dict2student)
print(stu)      # <__main__.Student object at 0x104ea9460>
print(type(stu))      # <class '__main__.Student'>

运行结果:

<__main__.Student object at 0x104ea9460>
<class '__main__.Student'>

说明:刘宏缔的架构森林—专注it技术的博客,
网址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/02/20/shi-yong-json-xu-lie-hua/
代码: https://github.com/liuhongdi/ 或 https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com

四,用json实现对象深拷贝

1,可以用json实现对对象的深拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def deep_copy(obj):
    # 将对象转换为 JSON 格式的字符串
    obj_str = json.dumps(obj)
 
    # 从 JSON 字符串中重新加载对象
    new_obj = json.loads(obj_str)
    return new_obj
 
 
# 测试
original_list = [1, 2, {'a': 'b'}]
copied_list = deep_copy(original_list)
print("原始列表:", original_list)
print("复制后的列表:", copied_list)

运行结果:

原始列表: [1, 2, {'a': 'b'}]
复制后的列表: [1, 2, {'a': 'b'}]
posted @ 2024-02-20 22:04  刘宏缔的架构森林  阅读(31)  评论(0编辑  收藏  举报