如何告诉jsonpickle在反序列化没有元数据的json时创建哪个类

7 投票
1 回答
3328 浏览
提问于 2025-04-18 15:50

我刚开始学Python,但在其他编程语言中,我可以告诉序列化工具我想要创建什么类型,然后它会根据反射或自省来处理属性。

如果用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" }'

我本来以为可以这样做:

jsonpickle.decode(jsons,TestObject)

这里有个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));

我知道Python没有类型限制等等……但我不明白为什么我需要搞复杂的字典映射才能进行基本的序列化。

1 个回答

1

首先,你提供的那个示例 JSON 输出并不是 jsonpickle 会生成的结果。实际上,你定义的 TestObject 的编码实例看起来是这样的:

'{"py/object": "__main__.TestObject", "_name": 4}'

注意,类型信息和实例变量是一起被编码的。解码后的输出会神奇地恢复成它原来的类型:

jsonpickle.decode('{"py/object": "__main__.TestObject", "_name": 4}')

这将是一个 TestObject 的实例。

撰写回答