最近刚接触到python,就想到了如何反序列化json串。网上找了一下,大部分都是用json模块反序列化为python数据结构(字典和列表)。如果对json模块不了解的参考菜鸟教程。然后我在此基础上将python数据转换为了自定义类对象。
下面是测试代码及运行结果:
import Json.JsonToolclass Score:math = 0chinese = 0class Book:name = ''type = ''class Student:id = ''name = ''score = Score()books = [Book()]student = Student()json_data = '{"id":"123", "name":"kid", "score":{"math":100, "chinese":98}, ' \'"books":[{"name":"math", "type":"study"}, ' \'{"name":"The Little Prince", "type":"literature"}]} ' Json.JsonTool.json_deserialize(json_data, student)print(student.name) print(student.score.math) print(student.books[1].name)input("\n按回车键退出。")
运行结果:
kid 100 The Little Prince按回车键退出。
实现代码如下:
import jsondef json_deserialize(json_data, obj):py_data = json.loads(json_data)dic2class(py_data, obj)def dic2class(py_data, obj):for name in [name for name in dir(obj) if not name.startswith('_')]:if name not in py_data:setattr(obj, name, None)else:value = getattr(obj, name)setattr(obj, name, set_value(value, py_data[name]))def set_value(value, py_data):if str(type(value)).__contains__('.'):# value 为自定义类 dic2class(py_data, value)elif str(type(value)) == "<class 'list'>":# value为列表if value.__len__() == 0:# value列表中没有元素,无法确认类型value = py_dataelse:# value列表中有元素,以第一个元素类型为准child_value_type = type(value[0])value.clear()for child_py_data in py_data:child_value = child_value_type()child_value = set_value(child_value, child_py_data)value.append(child_value)else:value = py_datareturn value