0

我試圖使用flexjson庫。但在我的對象中,我必須使用: com.google.api.client.util.DateTime其中沒有參數構造函數。我總是得到NoSuchMethodException與消息:Flexjson will instantiate any protected, private, or public no-arg constructor.我有來源,並試圖做一些事情,這裏是代碼:使用flexjson序列化對象

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

異常被拋出在clazz.getDeclaredConstructor()由於缺乏空的構造。什麼是找到構造函數的最佳方法讓我們說那些簽名:

DateTime(long timestamp)

有沒有人會遇到這種類型的問題,這個庫?也許你可以建議使用其他的。我使用它來序列化由Google Cloud Endpoints生成的對象。也許我可以用不同的方法做到這一點?

+0

最好的辦法是有一個空的構造。如果它存在於json對象中,您的時間戳將在稍後設置。爲此你可以考慮擴展DateTime。 – njzk2 2013-03-12 13:49:24

+0

njzk2,我無法擴展'DateTime',因爲它在自動生成的文件中,並且它是從'app-engine'後端的'java.util.Date'對象生成的。 – sennin 2013-03-12 14:23:18

回答

1

您不必更改Flexjson的源代碼就可以做到這一點。處理這個問題的方法是創建你自己的ObjectFactory實現,併爲你綁定的類型註冊它。從那裏你可以實例化它,但是,你的願望。子類BeanObjectFactory最簡單,並覆蓋方法instantiate()。在那裏你可以做任何你想創建一個你想要的對象的實例。通過繼承BeanObjectFactory,它將負責使用該對象的setter/getter將JSON中的各個屬性綁定到對象中。如果您的對象不支持屬性方法,您可能會發現實現ObjectFactory並從JSON手動設置該對象上的值會更容易。 Flexjson網站上有大量有關構建ObjectFactories的文檔。

然後您可以將您的ObjectFactory註冊使用該數據類型:

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