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