Джексон JsonParser получает токен массива

Я использую Jackson Json Parser для получения значений из строки JSON, а затем подключаю их к объекту Java. Вот кусок типа JSON, с которым я имею дело:

{
    "address":"aURL",
    "links":[
        "aURL",
        "aURL",
        "aURL"
    ]
}

Вот что у меня происходит в моем Java-коде. net является глобальным ArrayList, объекты Page имеют поле адреса String и поле ссылок String[]. Я хочу получить массив ссылок String из JSON и подключить их к объекту Page. Хотя я могу легко извлечь адресную строку с помощью метода getText(), я не могу придумать удобный способ просто получить массив String. Вот мой код прямо сейчас:

private static void parse(String json) throws IOException {
    JsonParser parser = new JsonFactory().createJsonParser(json);
    while (parser.nextToken() != JsonToken.END_OBJECT) {
        String tok = parser.getCurrentName();
        Page p = new Page();
        if ("address".equals(tok)) {
            parser.nextToken();
            p.setAddress(parser.getText());
        }
        if ("links".equals(tok)) {
            parser.nextToken();
            //p.setLinks(HOW TO GET STRING ARRAY)
        }
        net.add(p);
    }
}

Я бы предпочел придерживаться метода следующего JsonParser, который я использую, если только он не будет слишком громоздким.


person Jacob Nerney    schedule 21.10.2016    source источник
comment
Есть ли какая-то конкретная причина не использовать что-то гораздо более простое, например Gson?   -  person CodingNagger    schedule 21.10.2016


Ответы (1)


Вы можете попробовать что-то вроде этого.

private static void parse(String json) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonParser parser = new JsonFactory().createJsonParser(json);
    while (parser.nextToken() != JsonToken.END_OBJECT) {
        String tok = parser.getCurrentName();
        Page p = new Page();
        if ("address".equals(tok)) {
            parser.nextToken();
            p.setAddress(parser.getText());
        }
        if ("links".equals(tok)) {
            parser.nextToken();
            ArrayNode node = objectMapper.readTree(parser);
            Iterator<JsonNode> iterator = node.elements();
            String[] array = new String[node.size()];
            for (int i = 0; i < node.size(); i++) {
                if (iterator.hasNext()) {
                    array[i] = iterator.next().asText();
                }
            }
            p.setLinks(array);
        }
        net.add(p);
    }
}
person s7vr    schedule 21.10.2016
comment
ссылки String[] все еще имеют значение null - person Jacob Nerney; 22.10.2016
comment
Я только что проверил это снова. Он отлично работает для меня. пожалуйста, подтвердите еще раз. - person s7vr; 22.10.2016
comment
Я переключил некоторые вещи в другую часть своей программы, и в итоге это сработало для меня. - person Jacob Nerney; 25.10.2016