使用flexjson序列化对象

时间:2013-03-12 13:39:36

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

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

1 个答案:

答案 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);