前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python: Json串反序列化为自定义类对象

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

作者头像
用户7886150
修改2021-01-18 11:47:11
修改2021-01-18 11:47:11
2.1K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Python-Json 5 : python自定义class进行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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档