jsonpickle中对此有任何支持吗?
例如。我存储并反对,他们修改其架构,然后尝试将其加载回。
例如,以下更改(属性添加)
import jsonpickle
class Stam(object):
def __init__(self, a):
self.a = a
def __str__(self):
return '%s with a=%s' % (self.__class__.__name__, str(self.a))
js = jsonpickle.encode(Stam(123))
print 'encoded:', js
class Stam(object):
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return '%s with a=%s, b=%s' % (self.__class__.__name__, str(self.a), str(self.b))
s=jsonpickle.decode(js)
print 'decoded:', s
产生一个错误:
encoded: {"py/object": "__main__.Stam", "a": 123}
decoded: Traceback (most recent call last):
File "C:\gae\google\appengine\ext\admin\__init__.py", line 317, in post
exec(compiled_code, globals())
File "<string>", line 25, in <module>
File "<string>", line 22, in __str__
AttributeError: 'Stam' object has no attribute 'b'
最佳答案
jsonpickle中不支持类型演变或类型迁移。
最好的做法是将数据的JSON表示(通过json.loads
加载)到列表/字典/字符串/数字的基本Python结构中。遍历此Python表示形式,添加空/默认b
键。然后通过json.dumps
重新保存JSON。
然后,您可以使用jsonpickle加载数据的修改版本。
temp = json.loads(js)
temp['b'] = None
js = json.dumps(temp)
jsonpickle.decode(js)
如果对象模型更复杂,这显然会变得更复杂,但是您可以检查py / object键以查看是否需要修改对象。