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