【问题标题】:How can I tell jsonpickle which class to create when deserializing json that does not have jsonpickle metadata/type information在反序列化没有 jsonpickle 元数据/类型信息的 json 时,如何告诉 jsonpickle 要创建哪个类
【发布时间】:2014-09-26 07:11:33
【问题描述】:

我是 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" }'

我希望我可以这样做:

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 没有类型,等等......但是我没有理由需要为了进行基本的序列化而需要弄乱字典映射。

【问题讨论】:

  • 您的问题到底是什么?你读过jsonpickle docs吗?
  • @jonrsharpe 我认为我的问题相当简单。我已经阅读了文档和源代码。我会尝试更新问题

标签: python json


【解决方案1】:

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

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

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

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

将是一个 TestObject 实例。

【讨论】:

  • 我知道jsonpickle会添加类型信息,但是这种情况下的json不是来自jsonpickle。我只想将类型作为参数传递,因为它不在 json 中。
  • 在这种情况下,您只是询问如何在给定 json 键值映射的情况下实例化类。首先,我建议将 json 转换为 python 字典,您可以使用 jsonpickle 或只使用 json。其次,我将遍历字典中的 .items() 并调用 setattr(obj,key,value)。不幸的是 jsonpickle 还没有内置的方法来做这件事,但也许另一个库有。
  • 工作量很大。例如,我的问题中的 json 是微不足道的。我不想编写序列化程序并处理可能在 json 中的所有嵌套对象等。我想我从答案和反对票中得到的是 python 似乎没有这样做的库。在 java/c# 等中......更难反序列化(给定类型信息)......这些库非常常见,这种反序列化过程是常态。
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
相关资源
最近更新 更多