最近剛接觸到python,就想到了如何反序列化json串。網上找了一下,大部分都是用json模塊反序列化為python數據結構(字典和列表)。如果對json模塊不了解的參考菜鳥教程。然后我在此基礎上將python數據轉換為了自定義類對象。
下面是測試代碼及運行結果:
import Json.JsonTool class Score: math = 0 chinese = 0 class 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 json def 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_data else: # 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_data return value