Как получить значение json с Джексоном? - PullRequest
0 голосов
/ 02 мая 2020
String url = "https://ko.wikipedia.org/w/api.php?action=query&format=json&list=search&srprop=sectiontitle&srlimit=1&srsearch=grand-theft-auto-v";

String test = restTemplate.getForObject(url, String.class);

Map<String, String> testToJson = objectMapper.readValue(test, Map.class);

testToJson:

{
    batchcomplete: "",
    continue: {
        sroffset: 1,
        continue: "-||",
    },
    query: {
        searchinfo: {
            totalhits: 12
        },
        search: [
            {
                ns: 0,
                title: "그랜드 테프트 오토 V",
                pageid: 797633,
            }
        ],
    },
}

Я хочу получить title значение.

Я пытаюсь

testToJson.get("title")

, но возвращает ноль .

Как получить значение title с Джексоном?

Ответы [ 3 ]

2 голосов
/ 02 мая 2020

Вы можете десериализовать его до JsonNode и использовать JSON Pointer, чтобы получить обязательное поле:

JsonNode node = mapper.readValue(jsonFile, JsonNode.class);
String title = node.at("/query/search/0/title").asText();
0 голосов
/ 02 мая 2020

Невозможно прочитать JSON в экземпляре класса * generic c, подобного этому, потому что информация об обобщениях используется во время компиляции и уже потеряна при запуске программы.

Джексон захватывает данные о дженериках с использованием подклассифицированного экземпляра TypeReference<T>.

Map<String, String> testToJson = objectMapper.readValue(test, new TypeReference<Map<String, String>>(){});

. Проблема с этим подходом состоит в том, что Map<String, String> почти никогда не описывает сложные данные (как в примере) правильно. В примере содержатся не только строковые значения, но и числа и даже вложенные объекты.

В подобных ситуациях, когда вы не хотите или не можете написать класс, описывающий структуру JSON, чем лучше выбор заключается в разборе JSON в древовидную структуру и ее обходе. Например:

JsonNode node = objectMapper.readTree(test);
String title = node.get("query").get("search").get(0).get("title").asText();
Integer offset = node.get("continue").get("strOffset").asInt()
0 голосов
/ 02 мая 2020

Вы можете создать класс для этого json результата и затем прочитать его.

public class Result {
  private JsonNode searchinfo;
  private JsonNode[] searches;
}
// then read:
Result testToJson = objectMapper.readValue(test, Result.class);
System.out.println(testToJson.getSearches(0).get("title"));

см.

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