如何将JSON对象添加到Java中的作用域变量?

时间:2012-03-28 21:06:53

标签: xpages

我在applicationScope,sessionScope和viewScope中使用了很多JSON对象来跟踪相关数据。在SSJS中编写和阅读这些内容非常简单:`

//Create a app scope variable
applicationScope.put("myvarname", {p1:"part 1", p2:"part2"});

// read and use the app scope variable ...
var myvar = applicationScope.get("myvarname");
//Work with parts as myvar.p1, myvar.p2, etc...

在我编写的Java代码中,我学会了读取这些变量,这些变量是使用com.ibm.jscript.std.ObjectObject包使用SSJS编写的,代码如下:

ObjectObject myvar = (ObjectObject) ExtLibUtil
        .getApplicationScope().get(dbkey);
FBSValue localFBS = myvar.get("p1");
String myp1 = localFBS.stringValue();
localFBS = myvar.get("p2");
String myp2 = localFBS.stringValue();

现在,当然,我想使用Java Bean编写一个新条目,然后SSJS和其他Java Bean可以以相同的方式读取它。我设法使用Map和Hashtable写入作用域,但是在尝试使用ObjectObject读取时会破坏逻辑。

那么,我如何使用ObjectObject和/或FBSValue包在范围内构建新条目?我找不到如何创建一个新的FBSValue,然后可以将其添加到ObjectObject。我相信像我这样的Newbs错过了一件简单的事情。

/ Newbs

1 个答案:

答案 0 :(得分:6)

您可以构造一个空的ObjectObject,用FBSValues填充它,然后将其直接放入范围Map:

ObjectObject myvar = new ObjectObject();
try {
    myvar.put("p1", FBSUtility.wrap("part 1"));
    myvar.put("p2", FBSUtility.wrap("part 2"));
} catch (InterpretException e) {
    e.printStackTrace();
}
Map<String, Object> applicationScope = ExtLibUtil.getApplicationScope();
applicationScope.put("myvarname", myvar);

稍后检索它时(如您提供的示例中所示),SSJS会将其视为JSON,Java将完全按照存储的方式查看它。

如果您需要存储更深层次的层次结构,除了基元之外,您还可以将ArrayObject和ObjectObject的实例放在ObjectObject中,因此,就像JSON本身一样,您可以根据需要将它们嵌套。

如果你要将它存储在高于requestScope的任何地方,请确保只包含真正的JSON(字符串,数字,布尔值,数组,对象);具体来说,FunctionObject没有实现Serializable,因此 JSON 可以安全存储,而 JavaScript 则不然。严格来说,只有当存储在8.5.2和8.5.3中的viewScope中时才会变得有毒(即使这样,只有当应用程序的持久性选项未设置为将所有页面保留在内存中时)。但是,如果IBM实现了集群支持,那么存储在sessionScope和applicationScope中的所有对象都需要可序列化以允许服务器间状态传输......因此,为了将来设计的未来,最好坚持这一点。任何存储时间超过单个请求持续时间的原则。