Получить строки из массива JSON, используя Джексона - PullRequest
11 голосов
/ 20 ноября 2011

Я нашел несколько ответов, которые близки к тому, что я пытаюсь сделать, но недостаточно, чтобы я смог заставить его работать. У меня есть набор JSON, который выглядит как этот пример (только на несколько уровней глубже и с сотнями элементов на уровне, к которому я хочу получить доступ): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}. Я не могу изменить формат; это чужой API. Там довольно много того, что мне не нужно; на самом деле я хочу только что-то вроде массива ["bobsyeruncle", "easyaspie"]. (Или Список или что-то еще.)

Я экспериментировал с более простой версией JSON, у которой не было массива, и я мог легко получить доступ к одной строке, используя rootNode.get ("query"). Get ("pages") ... way описано в https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608. Но я так и не смог получить доступ к массиву. Большинство ответов, которые я нашел здесь, предполагают, что я хочу создать POJO, такой как «Ссылки», который включает в себя как «слово», так и «код», чего я не делаю. Чтобы получить доступ к нужным строкам, нужно ли создавать что-то вроде списка «ссылок», включающего «слово» и «код», а затем игнорировать «код»? Это не кажется правильным.

(Также, если бы кто-нибудь мог указать мне на документацию / учебники где-то между учебником JacksonInFiveMinutes и всем javadoc, я уверен, что это тоже поможет.)

ЭТА это сработало, я думаю!:

            String theJsonString = "{\"query\":{\"pages\":{\"links\":"
                + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(theJsonString);
        JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links");
        for (int i = 0; i < interestingObjectNode.size(); i ++) {
            System.out.println(interestingObjectNode.get(i).path("word").asText());
        }

Ответы [ 2 ]

10 голосов
/ 22 ноября 2011

Возможно, эта запись в блоге может помочь: Обход деревьев JSON с Джексоном ?

Я не уверен, какая именно у вас проблема, но стоит отметить, что массивы JSON просматриваютсяПроходной индекс входа, а не имя.Так что если вы используете objectNode.get("key"), вы используете arrayNode.get(0) вместо этого.Или, если вы хотите играть безопасно и разрешить «пропущенные» записи, используйте arrayNode.path(0) (и то же самое для объектов JSON).

Также помните, что вы можете вернуться между деревьями JSON (JsonNode) и POJO;ObjectMapper имеет несколько методов для преобразования между представлениями (convertValue (), readAsTree (), treeToValue (), valueToTree ()).Таким образом, можно использовать привязку данных для некоторых частей, модель дерева для других;иногда связывание поддеревьев в виде POJO, иногда просто связывание данных высокого уровня и доступ к поддеревьям с использованием модели дерева.Это очень мощный способ сделать что-то, но к этому нужно привыкнуть.

Надеюсь, это поможет!

1 голос
/ 20 ноября 2011

В GSON от Google, если вы создаете POJO, в котором отсутствуют некоторые свойства, отвечающий за ядро ​​JSON игнорируется.Он заполняет только те свойства, которые имеют совпадающие имена.Почему бы не создать такой класс:

Query{
Pages{
Word[] Links;
}
}

Word{
String word;
String code;
}

, а затем использовать LambdaJ, чтобы избежать написания всех циклов для получения слов?

Если это не привлекательно, посмотрите здесь и попробуйте JSONPath

Многие базы данных документов, такие как MongoDB, RavenDB и т. д., используют JSON в качестве формата хранения.Запросы сложного JSON встроены в них, используйте те же библиотеки, что и они.

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