JSON объект в карте, как получить его в Java? - PullRequest
0 голосов
/ 07 сентября 2018

В приложении XPages в переменной 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());
}   

В консоли я никогда не дохожу до "полученного объекта?" печать заявления. Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

JsonJavaObject - это ваш Java-класс POJO? Если да, тогда, пожалуйста, используйте ObjectMapper из Fasterxml для сопоставления ваших данных 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);
        }
    }
0 голосов
/ 10 сентября 2018

Используемый вами метод JavaScript JSON.parse возвращает просто простой объект JavaScript, а не JsonJavaObject. Вы не можете использовать объект JavaScript позже в Java без дополнительных ненужных накладных расходов. Не используйте json2.jss, используйте JsonParser, как Пол Уизерс сказал.

Измените код, который получает JSON, из поля Notes:

#{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

0 голосов
/ 07 сентября 2018

Была ли установлена ​​переменная sessionScope? Используйте sesScope.containsKey("configJSON") для подтверждения. Если это пустой объект JSON, это будет "{}", а не ноль. Если вы загружаете как JSON из службы REST или документа Notes, это может быть строка, а не JsonJavaObject. Для анализа строки JSON вы можете использовать com.ibm.commons.util.io.json.JsonParser. Конструктор для JsonJavaObject ожидает Map, не уверен, что это то, что передается.

...