Python: Json串反序列化为自定义类对象

    最近刚接触到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

 

posted @ 2019-03-05 11:40  william.hu  阅读(5760)  评论(2编辑  收藏  举报