2012-03-14 247 views
2

我想使用XPages運行時附帶的com.ibm.commons.util.io.json。*庫將Java Bean序列化爲JSON。XPage JSON庫可以自動將Java Bean轉換爲JSON表示嗎?

問題是可以通過傳遞對象來自動完成 - 就像您可以使用Google庫一樣 - http://code.google.com/p/google-gson/或者您是否需要手動構建JSON,我的意思是傳遞各個屬性來構造JSON。

有麻煩定位此庫的文檔,雖然我已經看到了一些例子:

http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=JSON%20and%20REST%20Samples

http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Sending_requests_in_Java_dds10

理想的情況下,我們不希望使用第三方庫,儘管它的偉大工程,因爲我們需要修改java安全屬性文件,如果服務器升級,它將被擦除。

回答

5

json的ibm commons庫通過構造一個對象,然後向該對象添加json屬性來工作。它不能自動序列化一個對象,並且只能用於原始數據類型。

我附上了一些SSJS代碼來說明如何使用該類。它假定recordMap是一個java映射實例,其中包含一些bean,每個bean有5個字段,分別爲fieldName1到fieldName5。代碼遍歷地圖中的每個bean,檢索5個字段,將這些值轉換爲JSON,然後將它們推送到數組中。最後,數組放入另一個包含count的json對象和數組本身。

var jsonObjArr = []; 

var itr:java.util.Iterator = recordMap.keySet().iterator(); 
while (itr.hasNext()) { 

    var record = recordMap.get(itr.next()); 
    var jsonObj:com.ibm.commons.util.io.json.JsonJavaObject = 
      new com.ibm.commons.util.io.json.JsonJavaObject(); 

    jsonObj.putJsonProperty("fieldName1", record.getFieldName1()); 
    jsonObj.putJsonProperty("fieldName2", record.getFieldName2()); 
    jsonObj.putJsonProperty("fieldName3", record.getFieldName3()); 
    jsonObj.putJsonProperty("fieldName4", record.getFieldName4()); 
    jsonObj.putJsonProperty("fieldName5", record.getFieldName5()); 
    jsonObj.putJsonProperty("fieldName6", record.getFieldName6()); 

    jsonObjArr.push(com.ibm.commons.util.io.json.JsonGenerator 
     .toJson(com.ibm.commons.util.io.json.JsonJavaFactory.instanceEx, empr)); 

}; 

var jsonString = "{" + 
    "count:" + @Text(jsonObjArr.length) + "," + 
    "employees:" + "[" + jsonObjArr.join(",") + "]" + 
"}"; 

return jsonString; 

希望這有助於..

+0

謝謝傑里米它有幫助,但它不理想。您認爲有沒有辦法將GSON庫摺疊到框架中,而無需更改Java安全屬性? – markbarton 2012-03-15 10:13:14

+0

林不知道,我不得不看看圖書館,但我猜測不會有太大的問題 - 不要以爲安全經理會抱怨那麼多。 – 2012-03-15 13:53:32

13

的com.ibm.commons.util.io.json庫是用於轉換JSON表示Java對象,來回genric庫。通過泛型,我的意思是它使用工廠來瀏覽和更新Java對象(請參閱:JsonFactory)。通過實現這樣的工廠,併爲所有屬性實現getter/setter,可以序列化/反序列化任何類型的對象。 的JSON庫配備有一組預定義的工廠:

  • JsonJavaFactory,映射JSON對象的Java地圖(與使用JsonJavaObject包裝物,更方便擴展版本)
  • JsonJavaScriptFactory,該地圖JSON對象到實際的JavaScript對象(請參閱:ObjectObject)和Java值(String,Integer ...)到JavaScript值(FBSString,FBSNumber ...)。這些對象可以直接由服務器端JS引擎使用。

我們沒有JavaBeans的工廠,但實現這樣的工廠應該不是什麼大問題。