0

我正在尝试使用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. 也许我可以用不同的方法做到这一点?

4

1 回答 1

1

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

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

 new JSONDeserializer<SomeObject>()
     .use( DateTime.class, new DateTimeObjectFactory() )
     .deserialize(json);
于 2013-03-12T21:39:01.733 回答