反序列化没有 jsonpickle 元数据/类型信息的 json 时,如何告诉 jsonpickle 创建哪个类

Cha*_*ant 7 python json

我是Python新手,但在其他语言中,我已经能够告诉序列化器我想要创建什么类型,并让它根据反射/内省反序列化或绑定属性。

如果您使用 jsonpickle 序列化它,jsonpickle 会将类型信息添加到 json,但是在这种情况下,我得到的 json 来自外部源,并且其中没有类型元数据。

我想将类型信息传递给序列化器。

import jsonpickle

class TestObject(object):

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

#from an external source
jsons = '{ "name" : "Test" }'
Run Code Online (Sandbox Code Playgroud)

我希望我可以做类似的事情:

jsonpickle.decode(jsons,TestObject)
Run Code Online (Sandbox Code Playgroud)

这是我的问题的 C# 示例: http://james.newtonking.com/json/help/index.html ?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject_3.htm

C# 看起来像:

public class TestObject {
    public string Name { get;set; }
}

var json = "{ "name" : "Test" }";

var deserialized = JsonConvert.DeserializeObject(json,typeof(TestObject));
Run Code Online (Sandbox Code Playgroud)

我知道 python 不是类型化的,等等……但是我没有理由需要为了进行基本的序列化而搞乱字典映射。

And*_*son 1

首先,您提供的示例 json 输出不是 jsonpickle 将输出的内容。相反,您定义的 TestObject 的编码实例将如下所示:

'{"py/object": "__main__.TestObject", "_name": 4}'
Run Code Online (Sandbox Code Playgroud)

请注意,类型与实例变量一起编码。解码后的输出将神奇地放回其原始类型:

jsonpickle.decode('{"py/object": "__main__.TestObject", "_name": 4}')
Run Code Online (Sandbox Code Playgroud)

将是一个 TestObject 实例。

  • 这是很多工作。例如,我的问题中的 json 是微不足道的。我不想编写序列化程序并处理 json 中可能存在的所有嵌套对象等。我想我从答案和反对票中得到的是 python 似乎没有一个库可以做到这一点。在 java/c# 等中...反序列化更困难(给定类型信息)...这些库非常常见,这种反序列化过程是常态。 (4认同)