Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jsonpickle(python)进行类型演化_Python_Schema_Jsonpickle - Fatal编程技术网

使用jsonpickle(python)进行类型演化

使用jsonpickle(python)进行类型演化,python,schema,jsonpickle,Python,Schema,Jsonpickle,jsonpickle中是否支持此功能 例如,我存储和对象,它们修改其模式,然后尝试将其加载回 例如,以下更改(属性添加) 产生一个错误: 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(comp

jsonpickle中是否支持此功能

例如,我存储和对象,它们修改其模式,然后尝试将其加载回

例如,以下更改(属性添加)

产生一个错误:

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'
encoded:{“py/object”:“\uuuu main\uuuuuu.Stam”,“a”:123}
解码:回溯(最近一次呼叫最后一次):
文件“C:\gae\google\appengine\ext\admin\\uuuuu init\uuuuuu.py”,第317行,在post中
exec(编译的_代码,globals())
文件“”,第25行,在
文件“”,第22行,在__
AttributeError:“Stam”对象没有属性“b”

jsonpickle中不支持类型演化或类型迁移

最好的做法是(通过
json.loads
)将数据的json表示加载到一个基本的Python结构中,该结构由list/dicts/strings/numbers组成。遍历此Python表示,添加空/默认
b
键。然后通过
JSON.dumps
重新保存JSON

然后可以使用jsonpickle加载数据的修改版本

temp = json.loads(js)
temp['b'] = None
js = json.dumps(temp)
jsonpickle.decode(js)

如果对象模型更复杂,这显然会变得更复杂,但是您可以检查py/object键以查看是否需要修改对象。

jsonpickle中不支持类型演化或类型迁移

最好的做法是(通过
json.loads
)将数据的json表示加载到一个基本的Python结构中,该结构由list/dicts/strings/numbers组成。遍历此Python表示,添加空/默认
b
键。然后通过
JSON.dumps
重新保存JSON

然后可以使用jsonpickle加载数据的修改版本

temp = json.loads(js)
temp['b'] = None
js = json.dumps(temp)
jsonpickle.decode(js)

如果对象模型更复杂,这显然会变得更复杂,但是您可以检查py/object键以查看是否需要修改对象。

由于版本控制问题,单独使用jsonpickle还不够 持久化对象。您还需要在中保留一个版本标识符 JSON输出,以便您可以在需要时改装(清理)数据 阅读旧版本

话虽如此,你还是可以做一些事情让生活更轻松。你 可以将json.dumps的default=dict参数与 iter在您的对象上。这将使您可以将对象持久化为 字典。然后,当您读入时,可以使用**dict运算符和 用于从JSON字典中重新实例化对象的关键字参数

这允许您读入持久化对象并提供 初始化任何新属性。例如,如果我们从一个 类,并将其持久化,然后将该类扩展为 具有val2属性并从持久化状态还原:

import json

class Stam( object ) :
    val1 = None
    def __init__( self, val1=None ) :
        self.val1 = val1

    def __iter__( self ) : return {
        'val1':self.val1
    }.iteritems()

obj1 = Stam( val1='a' )
persisted = json.dumps( obj1, default=dict )

class Stam( object ) :
    val1 = None
    val2 = None
    def __init__( self, val1=None, val2='b' ) :
        self.val1 = val1
        self.val2 = val2

    def __iter__( self ) : return {
        'val1':self.val1,
        'val2':self.val2
    }.iteritems()

obj2 = json.loads( persisted, object_hook=lambda d: Stam(**d) )
assert obj2.val1 == 'a'
assert obj2.val2 == 'b'
当然,我们也可以使用jsonpickle并跳过
\uuuuu iter\uuuu
和 额外的json参数,因为jsonpickle将忽略缺少的 属性。因此,任何新的val2都将具有静态类初始化 已提供,但它不会运行
\uuuuu init\uuuuu
克托尔。这将成为:

import jsonpickle

class Stam( object ) :
    val1 = None
    def __init__( self, val1 ) :
        self.val1 = val1

obj1 = Stam( 'a' )
persisted = jsonpickle.encode( obj1 )

class Stam( object ) :
    val1 = None
    val2 = 'b'
    def __init__( self, val1, val2 ) :
        self.val1 = val1
        self.val2 = val2

obj2 = jsonpickle.decode( persisted )
assert obj2.val1 == 'a'
assert obj2.val2 == 'b'

由于版本控制问题,单独使用jsonpickle还不够 持久化对象。您还需要在中保留一个版本标识符 JSON输出,以便您可以在需要时改装(清理)数据 阅读旧版本

话虽如此,你还是可以做一些事情让生活更轻松。你 可以将json.dumps的default=dict参数与 iter在您的对象上。这将使您可以将对象持久化为 字典。然后,当您读入时,可以使用**dict运算符和 用于从JSON字典中重新实例化对象的关键字参数

这允许您读入持久化对象并提供 初始化任何新属性。例如,如果我们从一个 类,并将其持久化,然后将该类扩展为 具有val2属性并从持久化状态还原:

import json

class Stam( object ) :
    val1 = None
    def __init__( self, val1=None ) :
        self.val1 = val1

    def __iter__( self ) : return {
        'val1':self.val1
    }.iteritems()

obj1 = Stam( val1='a' )
persisted = json.dumps( obj1, default=dict )

class Stam( object ) :
    val1 = None
    val2 = None
    def __init__( self, val1=None, val2='b' ) :
        self.val1 = val1
        self.val2 = val2

    def __iter__( self ) : return {
        'val1':self.val1,
        'val2':self.val2
    }.iteritems()

obj2 = json.loads( persisted, object_hook=lambda d: Stam(**d) )
assert obj2.val1 == 'a'
assert obj2.val2 == 'b'
当然,我们也可以使用jsonpickle并跳过
\uuuuu iter\uuuu
和 额外的json参数,因为jsonpickle将忽略缺少的 属性。因此,任何新的val2都将具有静态类初始化 已提供,但它不会运行
\uuuuu init\uuuuu
克托尔。这将成为:

import jsonpickle

class Stam( object ) :
    val1 = None
    def __init__( self, val1 ) :
        self.val1 = val1

obj1 = Stam( 'a' )
persisted = jsonpickle.encode( obj1 )

class Stam( object ) :
    val1 = None
    val2 = 'b'
    def __init__( self, val1, val2 ) :
        self.val1 = val1
        self.val2 = val2

obj2 = jsonpickle.decode( persisted )
assert obj2.val1 == 'a'
assert obj2.val2 == 'b'