Search code examples
javajsonxpages

Json object in Map, how to get hold of it in java?


In an XPages application I have in a sessionScope variable the configuration for the application in JSON format.

I wonder how I can get hold of this configuration again in Java?

I tried:

Map<String, Object> sesScope = ExtLibUtil.getSessionScope();
if (null != sesScope.get("configJSON")){
    JsonJavaObject jsonObject = new JsonJavaObject();
    jsonObject = (JsonJavaObject) sesScope.get("configJSON");
    System.out.println("got object?");
    System.out.println("json " + jsonObject.toString());
}   

In the console I never get to the "got object?" print statement. What am I doing wrong?


Solution

  • The JavaScript method JSON.parse that you use, returns just a plain simple JavaScript object, not the JsonJavaObject. You can't use JavaScript object later in Java without additional unnecessary overhead. Don't use json2.jss, use JsonParser like Paul Withers have told.

    Change your code that gets JSON from your Notes field:

    #{javascript:
        importPackage(com.ibm.commons.util.io.json);
        var jsonText = doc.getItemValueString(itemname);
        var jsonFactory:JsonFactory = JsonJavaFactory.instanceEx;
        var jsonObject = JsonParser.fromJson(jsonFactory, jsonText);
        sessionScope.put('configJSON', jsonObject);
    }
    

    Modify your provided java code by removing unnecessary line:

    Map<String, Object> sesScope = ExtLibUtil.getSessionScope();
    if (null != sesScope.get("configJSON")) {
        JsonJavaObject jsonObject = (JsonJavaObject) sesScope.get("configJSON");
        System.out.println("got object?");
        System.out.println("json " + jsonObject.toString());
    }
    

    You should now be OK. Hint: if you use JsonJavaFactory.instance instead of JsonJavaFactory.instanceEx, you'll get java.util.HashMap instead of JsonJavaObject