在XPage应用程序中,我在sessionScope变量中有JSON格式的应用程序配置。
我想知道如何在Java中再次掌握这种配置?
我试过了:
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());
}
在控制台中我永远不会得到“有对象?”打印声明。我究竟做错了什么?
您使用的JavaScript方法JSON.parse
只返回一个简单的JavaScript对象,而不是JsonJavaObject
。如果没有额外的不必要的开销,您不能在Java中使用JavaScript对象。不要使用json2.jss
,像Paul Withers所说的那样使用JsonParser
。
更改从Notes字段获取JSON的代码:
#{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);
}
通过删除不必要的行来修改您提供的Java代码:
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());
}
你现在应该没事。提示:如果你使用JsonJavaFactory.instance
而不是JsonJavaFactory.instanceEx
,你会得到java.util.HashMap
而不是JsonJavaObject
是否已设置sessionScope变量?使用sesScope.containsKey("configJSON")
进行验证。如果它是一个空的JSON对象,它将是“{}”而不是null。如果您从REST服务或Notes文档加载为JSON,则它可能是String而不是JsonJavaObject。要解析JSON字符串,可以使用com.ibm.commons.util.io.json.JsonParser
。 JsonJavaObject的构造函数需要一个Map,不确定这是否是传入的内容。
JsonJavaObject是你的POJO java类?如果是,那么请使用Fasterxml的ObjectMapper将您的JSON数据映射到JsonJavaObject类的字段。使用此方法将您的json数据映射到任何POJO类
public final T validateJson(final Map<String, Object> jsonMap, final T temmplateClass) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
try {
// convert JSON string to Map
String jsonString = objectMapper.writeValueAsString(jsonMap);
return objectMapper.readValue(jsonString, (Class<T>) temmplateClass);
} catch (JsonMappingException e) {
throw new NestableRuntimeException(String.format(ApiCommonConstants.INVALID_JSON_FIELD,
e.getPath().get(e.getPath().size() - 1).getFieldName()));
} catch (IOException e) {
throw new NestableRuntimeException(e.getMessage(), e);
}
}