【问题标题】:Serializing objects with flexjson使用 flexjson 序列化对象
【发布时间】:2013-03-12 13:39:35
【问题描述】:

我正在尝试使用flexjson 库。但在我的对象中,我必须使用: com.google.api.client.util.DateTime 没有没有参数的构造函数。我总是收到NoSuchMethodException 和消息:Flexjson will instantiate any protected, private, or public no-arg constructor. 我有资源并试图用它做点什么,这里是代码:

constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
return constructor.newInstance();

由于缺少空构造函数,clazz.getDeclaredConstructor() 中抛出异常。假设这些签名,找到构造函数的最佳方法是什么:

DateTime(long timestamp)?

有人在这个库中遇到过这种问题吗?也许你可以建议使用其他的。我正在使用它来序列化Google Cloud Endpoints 生成的对象。也许我可以用不同的方法做到这一点?

【问题讨论】:

  • 最好的方法是有一个空的构造函数。如果它存在于 json 对象中,您的时间戳将在稍后设置。为此,您可以考虑延长 DateTime。
  • njzk2,我无法扩展DateTime,因为它在自动生成的文件中,并且它是从app-engine 后端上的java.util.Date 对象生成的。

标签: java android google-app-engine google-cloud-endpoints flexjson


【解决方案1】:

您无需更改 Flexjson 的源代码即可执行此操作。处理此问题的方法是创建您自己的 ObjectFactory 实现并将其注册为您要绑定的类型。从那里您可以实例化它,但是,您希望。继承 BeanObjectFactory 并覆盖方法 instantiate() 是最简单的。在那里你可以做任何你想做的事情来创建你想要的对象的实例。通过子类化 BeanObjectFactory ,它将使用该对象的 setter/getter 将 JSON 中的各个属性绑定到您的对象中。如果您的对象不支持属性方法,您可能会发现实现 ObjectFactory 并从 JSON 手动设置该对象的值更容易。 Flexjson 网站上有很多关于构建 ObjectFactories 的文档。

然后您可以使用以下方法将您的 ObjectFactory 注册到该数据类型:

 new JSONDeserializer<SomeObject>()
     .use( DateTime.class, new DateTimeObjectFactory() )
     .deserialize(json);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2012-09-16
    相关资源
    最近更新 更多