我正在尝试使用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
生成的对象。也许我可以用不同的方法?
您不必更改Flexjson的源代码来做到这一点。处理这个问题的方法是创建您自己的ObjectFactory实现,并将其注册为要绑定到的类型。从那里,您可以根据需要实例化它。最简单的方法是继承BeanObjectFactory并覆盖方法instantiate()。在这里,你可以做任何你想做的事情来创建一个你想要的对象的实例。通过继承BeanObjectFactory,它将使用对象的setter/getter将JSON中的各个属性绑定到对象中。如果您的对象不支持属性方法,您可能会发现实现ObjectFactory并从JSON中手动设置该对象的值更容易。Flexjson网站上有很多关于构建ObjectFactories的文档。
然后您可以使用以下命令将ObjectFactory注册为该数据类型:
new JSONDeserializer<SomeObject>()
.use( DateTime.class, new DateTimeObjectFactory() )
.deserialize(json);