• 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
  • 相关阅读:
    LOJ164 高精度除法
    CQOI2013 新Nim游戏 和 BZOJ1299 巧克力棒
    UOJ514 通用测评号 和 CF891E Lust
    CF526F Pudding Monsters 和 CF997E Good Subsegments
    UOJ513 清扫银河
    SNOI2020 水池
    NOI2015 品酒大会 和 SNOI2020 字符串
    SNOI2020 生成树
    BJOI2020 封印
    UOJ523 半前缀计数
  • 原文地址:https://www.cnblogs.com/dasheng-maritime/p/13050578.html
Copyright © 2020-2023  润新知