Как проверить, является ли JsonNode одним элементом или массивом в Java?

Я просматриваю ответ json с помощью JsonNode (com.fasterxml.jackson.databind.JsonNode)

Как я могу проверить, является ли данный JsonNode одним элементом или массивом? Потому что мне нужно пройти его глубже и обновить некоторые значения (например, значение имени)

Я могу получить такой ответ json: (с одним элементом)

{  person: {
      name: "name1",
      address: "address1"
   } 
}

или я могу получить такой ответ json: (с)

{  "person": [ 
       {
         "name": "name1",
         "address": "address1"
       }, 
       {
         "name": "name2",
         "address": "address2"
       }
   ]
}

Для одного элемента у меня есть этот код:

ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonString);
JsonNode personNode = root.findPath("person");
if (!personRootNode.isMissingNode()) 
   ((ObjectNode)nameNode).put("name","UPDATED NAME");

И для элемента массива у меня есть этот код

ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonString);
JsonNode personNode = root.findPath("person");
if (!personNode .isMissingNode()) 
   for(JsonNode node: personRootNode){
      if (!node.isMissingNode()) {
         ((ObjectNode)node).put("name","UPDATED NAME");
      }
   }

Я хочу смешать логику в одном месте, потому что единственное отличие - это цикл for

Я могу заключить логику замены в функцию / метод. Но как мне проверить, является ли текущий узел элементом или массивом?

personNode.isArray() это то, о чем вы просите?
Vladimir L. 14.08.2018 00:01

Да, это то, что я искал. Спасибо большое

JaimeRG 14.08.2018 00:06

Пожалуйста, прочтите документацию, то есть javadoc JsonNode, и вы найдете множество методов isXxx() для определения типа узла.

Andreas 14.08.2018 00:11

Да, мне очень жаль. Я думал, что это сложнее, но, к счастью, это было легко.

JaimeRG 15.08.2018 01:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
6 618
2

Ответы 2

Вы можете вызвать функцию isArray () для объекта JsonNode. Например:


    ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(s2);
JsonNode personNode = root.findPath("person");
if (personNode.isArray()) {
///array found
} else {
// non-array element
}

Спасибо, это работает. Я думал, что тип узла сложнее определить.

JaimeRG 15.08.2018 01:58

используйте метод ниже. Введите JSONObject для проверки и имя узла. (Используется org.json.JSONObject)

private void checkNodeStatus(JSONObject jsonObject, String node) {
    if (jsonObject.optJSONArray(node) != null) {
    } else if (jsonObject.optString(node) != null) {
        JSONArray array = new JSONArray();
        array.put(jsonObject.getJSONObject(node));
        jsonObject = jsonObject.put(node, array);
    } else {
        System.out.println("error in checkNodeStatus > node : " + node);
    }
}

если это JSONObject, он преобразуется в JSONArray.

Другие вопросы по теме