Как извлечь элемент JSON из объекта JsonNode в виде строки, используя jackson?

#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"));