Python练习-json操作
本部门学习Python的json转换操作。跟之前学的通过bytes的序列化接口非常类似。只是在类转换的时候略有不同。
一、dict对象转换
对于dict对象,可直接进行通过json.dumps/json.dump接口转换字符串或保存到文件中。
1
2
3
4
5
d = dict(name='Bob', age=18)
print(json.dumps(d))
json_file_path = os.path.join(pwd, "resources", "json_demo")
with open(json_file_path, "w") as jfile:
json.dump(d, jfile)
输出为:
1
{"name": "Bob", "age": 18}
同样,从json或文件转换为json对象代码如下:
1
2
3
4
5
6
7
8
obj_from_json_str = json.loads('{"name": "Bob", "age": 18}')
print(obj_from_json_str)
obj_from_json_file = None
with open(json_file_path, "r") as jfile:
obj_from_json_file = json.load(jfile)
print(obj_from_json_file)
print(obj_from_json_str == obj_from_json_file)
print(obj_from_json_str is obj_from_json_file)
同样,两次转换结果只是值相同,为不同的对象。
二、类对象的json转换
对于一般类对象的json转换,需要指定属性处理的方法,一般来说类对象默认有__dict__属性,处理属性转换:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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('Bob', 20, 88)
print(json.dumps(s, default=student2dict))
print(json.dumps(s, default=lambda obj: obj.__dict__))
从json到类对象,一样需要指定处理函数
1
2
3
4
5
6
7
# 转换为类对象
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
print(json.loads('{"age": 20, "score": 88, "name": "Bob"}'))
print(json.loads('{"age": 20, "score": 88, "name": "Bob"}', object_hook=dict2student))
三、小练习
1
2
3
4
5
6
7
# 练习:对中文进行JSON序列化时,json.dumps()提供了一个ensure_ascii参数,观察该参数对结果的影响:
obj = dict(name='小明', age=20)
s = json.dumps(obj, ensure_ascii=True)
print(s)
s_false = json.dumps(obj, ensure_ascii=False)
print(s_false)
print(json.dumps(dict(name='小明大虎', age=20), ensure_ascii=True))
输出为:
1
2
3
{"name": "\u5c0f\u660e", "age": 20}
{"name": "小明", "age": 20}
{"name": "\u5c0f\u660e\u5927\u864e", "age": 20}
本文由作者按照 CC BY 4.0 进行授权