#java #json #spring #spring-boot #jackson
#java #json #spring #spring-boot #джексон
Вопрос:
Я довольно новичок в Jackson и Spring-Boot. Я пытаюсь проанализировать объект JsonNode, чтобы извлечь вложенное свойство из объекта JsonNode в виде строки.
Это для приложения с весенней загрузкой, где я размещаю файл json в ArrayList моего объекта класса, а затем считываю один элемент массива в объект JsonNode. Я попытался преобразовать объект JsonNode в ArrayNode, а затем сохранить в нем родительское свойство, используя
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
JsonNode rootNode = mapper.valueToTree(workflow);
ArrayNode arrayNode = (ArrayNode) rootNode.get("metadata");
а затем найдите требуемое свойство в ArrayNode, используя
Iterator<JsonNode> arrayNodeIterator = arrayNode.elements();
while(arrayNodeIterator.hasNext()){
JsonNode jsonNode = arrayNodeIterator.next();
String str = jsonNode.get("name").asText();
}
Ниже приведен json, который я пытаюсь прочитать
{
"metadata": {
"name": "workflow-name"
},
"tasks": []
}
Однако я получаю следующую ошибку при запросах GET.
java.lang.ClassCastException: class com.fasterxml.jackson.databind.node.ObjectNode cannot be cast to class com.fasterxml.jackson.databind.node.ArrayNode (com.fasterxml.jackson.databind.node.ObjectNode and com.fasterxml.jackson.databind.node.ArrayNode are in unnamed module of loader '
Ответ №1:
Из приведенного выше JSON metadata
является JSONObject
это не ArrayNode
1) получить metadata
как JsonNode
JsonNode rootNode = mapper.valueToTree(workflow);
JsonNode metaNode = rootNode.get("metadata");
2) Теперь получаем name
System.out.println(metaNode.get("name").textValue());
3) tasks
есть ArrayNode
так что получите tasks
как Array
ArrayNode arrayNode = (ArrayNode) rootNode.get("tasks");
Ответ №2:
попробуйте этот пример … для получения дополнительной информации проверьте здесь https://www.baeldung.com/jackson-json-to-jsonnode
String jsonString = "{"k1":"v1","k2":"v2"}";
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(jsonString);
// When
JsonNode jsonNode1 = actualObj.get("k1");
assertThat(jsonNode1.textValue(), equalTo("v1"));