XPage JSON库能否自动将Java Bean转换为JSON表示?

时间:2012-03-14 16:24:43

标签: java json xpages

我想使用XPages运行时附带的com.ibm.commons.util.io.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安全属性文件,如果服务器升级,它会被擦除。

2 个答案:

答案 0 :(得分:13)

com.ibm.commons.util.io.json库是一个genric库,用于将JSON表示转换为Java对象,来回。通用,我的意思是它使用工厂来浏览和更新Java对象(参见:JsonFactory)。通过实现这样的工厂,并为所有属性实现getter / setter,可以序列化/反序列化任何类型的对象。 JSON库配备了一组预定义的工厂:

  • JsonJavaFactory,它将JSON对象映射到Java Maps(使用扩展版本,使用更方便的JsonJavaObject包装器)
  • JsonJavaScriptFactory,它将JSON对象映射到实际的JavaScript对象(请参阅:ObjectObject),将Java值(String,Integer ...)映射到JavaScript值(FBSString,FBSNumber ...)。这些对象可以由服务器端JS引擎直接使用。

我们没有JavaBeans的工厂,但实施这样的工厂应该不是什么大问题。

答案 1 :(得分:5)

json的ibm commons库通过构造一个对象,然后将json属性添加到对象来工作。它不能自动序列化对象,并且只能用于原始数据类型。

我附上了一些SSJS代码来说明如何使用该类。它假设recordMap是一个包含一些bean的java map实例,每个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;

希望这会有所帮助..