Джексон Аррайнод - PullRequest
1 голос
/ 18 ноября 2011

У меня есть входной объект json, который содержит массив, как показано ниже:

[{"key11":"value11","key12":"value12"},
{"key21":"value21","key22":"value22"},
...
{"keyn1":"valuen1","keyn2":"valuen2"}]

Я хотел бы использовать парсер Джексона, во-первых, чтобы определить количество строк, а во-вторых, печатать только значения наэкран.Я хочу, чтобы он был максимально легким.Кто-нибудь может указать мне направление?

Ответы [ 2 ]

2 голосов
/ 27 декабря 2014

Предполагая, что row является одной из записей в ArrayNode, может быть полезен следующий простой подход. Он использует абстракцию JsonNode вместо ряда вложенных Map объектов, которые я лично предпочитаю, поскольку JsonNode предоставляет ряд служебных методов, которые полезны при работе с данными такого типа (данные, где структура, возможно, неизвестна или очень динамична, поэтому ее нельзя легко преобразовать в POJO).

Тестовый пример ниже показывает, как найти количество строк и как распечатать значения. Чтобы получить значения, используется метод JsonNode.elements(), а количество строк - это просто вызов size() -метода.

public class ArrayNodeTest {
    @Test
    public void verifySizeAndPrintRows() throws IOException {
        final String jsonStr =
                "[{\"key11\":\"value11\",\"key12\":\"value12\"},\n" +
                        "{\"key21\":\"value21\",\"key22\":\"value22\"},\n" +
                        "{\"keyn1\":\"valuen1\",\"keyn2\":\"valuen2\"}]";

        final ObjectMapper mapper = new ObjectMapper();
        final JsonNode jsonNode = mapper.readTree(jsonStr);

        // Verify size
        Assert.assertEquals(3, jsonNode.size());

        // And print rows
        for (final JsonNode row : jsonNode) {
            final Iterable<JsonNode> iterable = () -> row.elements();
            iterable.forEach(elem -> System.out.println(elem.asText()));
        }
    }
}
0 голосов
/ 18 ноября 2011

для определения количества строк

Что такое "строка"? Является ли пара ключ / значение строкой? Является ли элемент массива JSON (независимо от того, сколько пар ключ / значение он содержит) строкой?

печать только значений на экране

Джексон не имеет ничего общего с печатью на любых экранах. Джексона можно использовать для заполнения структуры данных Java из входного JSON, а затем заполненную структуру данных Java можно использовать по своему усмотрению.

Учитывая структуру JSON в исходном вопросе, простым решением будет привязка к списку (или массиву) карт, а затем просто итерация по списку карт с доступом ко всем значениям. Ниже приведен такой пример.

import java.io.File;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    Map<String, String>[] maps = mapper.readValue(new File("input.json"), Map[].class);
    for (Map<String, String> map : maps)
    {
      for (Map.Entry<String, String> entry : map.entrySet())
      {
        System.out.println(entry.getValue());
      }
    }
  }
}

Выход:

value11
value12
value21
value22
valuen1
valuen2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...