python json转对象 指定字段名称

# -*- coding:utf-8 -*-
import importlib
import os

print(os.path.realpath(__file__))
print(os.path.abspath(__file__))

car_json_body = {
    "carId": 1,
    "company": {
        "name": "c_1",
    }
}


class Car(object):
    def __init__(self):
        self._car_id = None
        self._company = None

    @property
    def carId(self):
        return self._car_id

    @carId.setter
    def carId(self, car_id):
        self._car_id = car_id

    @property
    def company(self):
        return self._company

    @company.setter
    def company(self, company):
        if isinstance(company, Company):
            self.company = company
            return

        self._company = parse_json_to_object(company, "test_json.Company")


class Company(object):
    def __init__(self):
        self._name = None

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name


def parse_json_to_object(obj_json, class_full_path=None):
    """ 根据给定的json字典和待转换的类的全路径,得到反序列化后的对象 """
    print("data json:%s." % obj_json)
    print("class full path:%s." % class_full_path)

    if obj_json is None:
        print("Have no obj json.")
        return None

    if class_full_path is None:
        return obj_json
    else:
        try:
            # 获取模块路径
            module_path = ".".join(class_full_path.split(".")[0:-1])
            # 获取类名称
            class_name = class_full_path.split(".")[-1]
            # 通过模块名加载模块
            imported_module_obj = importlib.import_module(module_path)
            # 判断是否有class_name所代表的属性
            if hasattr(imported_module_obj, class_name):
                # 获取模块中属性
                temp_obj_class = getattr(imported_module_obj, class_name)
                # 实例化对象
                temp_obj = temp_obj_class()
                for key in obj_json:
                    temp_obj.__setattr__(key, obj_json[key])
                return temp_obj
            else:
                print("Can not find class:%s in module:%s." % (class_name, module_path))
                return None

        except Exception as err:
            print("Error:", err)
            return None


c = parse_json_to_object(car_json_body, "test_json.Car")
print(c.__dict__)

  采用 

@property 和 python中的反射机制实现反解析json
posted @ 2020-06-05 16:39  百变小超  阅读(1659)  评论(0编辑  收藏  举报