JSONModel,模型和JSON数据之间相互转换,或者模型和JSON数据的序列化、反序列化。
不同语言实现细节不一样,也并不是所有语言都可以实现。这里我参考Objective-C语言的JSONModel实现机制,设计了一种Python运行时JSON和Model的互转方案思路。
object类
用dir打印object
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
挨个找,看到两个方法__setattr__
和__getattribute__
,看名字也大概知道用途,基本意思就是可以通过__setattr__
和__getattribute__
访问object实例的属性值。
具体可参考https://www.cnblogs.com/elie/p/6685429.html
-
__setattr__
如果类自定义了__setattr__
方法,当通过实例获取属性尝试赋值时,就会调用__setattr__
。常规的对实例属性赋值,被赋值的属性和值会存入实例属性字典__dict__
中;如下类自定义了__setattr__
,对实例属性的赋值就会调用它。类定义中的self.attr也同样,所以在__setattr__
下还有self.attr的赋值操作就会出现无线递归的调用__setattr__
的情况。自己实现__setattr__
有很大风险,一般情况都还是继承object类的__setattr__
方法。 -
__getattribute__
实例instance通过instance.name访问属性name,__getattribute__
方法一直会被调用,无论属性name是否追溯到。如果类还定义了__getattr__
方法,除非通过__getattribute__
显式的调用它,或者__getattribute__
方法出现AttributeError错误,否则__getattr__
方法不会被调用了。如果在__getattribute__(self, attr)
方法下存在通过self.attr访问属性,会出现无限递归错误。
步骤
只讨论最小场景(当然可以自行扩展)
json -> model
这里假设json是一个字典,且没有嵌套情况。
并且假设应知道model的类名,一个字典对应一个model。
遍历json所有key ,然后按照key名称给model的属性赋值。
示意代码
dict = json数据
model=类的实例
for (key,value) in dict.items():
model.__setattr__(key,value)
model -> json
这里假设model的所有属性都能转化为对应的json数据,且没有嵌套。
这里,还需要借助__dict__
函数
示意代码
dict = {}
for (name,_) in model.__dict__.items():
value = model.__getattribute__(name)
if value != None:
dict[name] = value
发表回复
要发表评论,您必须先登录。