下面看看转换的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import json import importlib def get_instance(str_stream, class_full_path=None): """ :param str_stream: json的字符串形式 '{"Name": "Tom", "Sex": "Male", "BloodType": "A"}' :param class_full_path: package.module.class :return: """ try: json_obj = json.loads(str_stream) except Exception as err: print("输入的字符串不符合JSON格式,请检查。") return None if class_full_path is None: return json_obj else: try: # 获取模块路径 module_path = ".".join(class_full_path.split(".")[0:-1]) # 获取类名称 class_name = class_full_path.split(".")[-1] # 通过模块名加载模块 CC = importlib.import_module(module_path) # 判断是否有class_name所代表的属性 if hasattr(CC, class_name): # 获取模块中属性 temp_obj = getattr(CC, class_name) # 实例化对象 obj = temp_obj() for key in json_obj.keys(): obj.__setattr__(key, json_obj[key]) return obj else: pass except Exception as err: print(err) return None def main(): try: str1 = '{"Name": "Tom", "Sex": "Male", "BloodType": "A", "Hobbies": ["篮球", "足球"]}' person1 = get_instance(str1, class_full_path="AAA.Classes.Person") # 查看类型 print(type(person1)) # 查看属性 print(person1.__dict__) # 查看指定属性 print(person1.Name) except Exception as err: print(err) if __name__ == "__main__": try: main() finally: sys.exit()__import__() 有2个参数,第一个是类,第二个是fromlist,如果不写fromlist,则按照下面的写法会只导入AAA包,如果fromlist有值则会导入AAA下面的Classes模块cc = __import__("AAA.Classes", fromlist=True)不写fromlist 相当于 import AAA ,如果写了就相当于是from AAA import Classes编程时如果使用动态加载建议使用importlib.import_module(),而不是__import__()。
下面看一下效果:
可以看到,这样操作之后就是给实例变量赋值而不是像之前那样的替换,而且保留了类中实例变量的私有规范。不过需要说明的是JSON字符串中的键名称要和类里面定义的属性名称一样,也就是键名称要和类中@property装饰的方法同名。我们也可以看到这种使用方式也有默认JSONObject.parseObject的意思。
不过这只是一个简单的实现,只能通过单一JSON字符串生成对象不能生成对象列表。当然有兴趣的朋友可以自己根据这个思路进行扩展。