ObjectMapper не принимает ответ JSON от HttpURLConnection - PullRequest
0 голосов
/ 15 ноября 2018

Возникают проблемы при чтении строки JSON, которую я строю из BufferedReader и пытаюсь присвоить значения классу POJO.

Это работает, когда я использую этот формат (Обнаружен случайно. Копировать вставить):

String build = {\"feature\":{\"id\":\"888888\",\"name\":\"A9 Refresh Release\"}

Но на самом деле при чтении из BufferedReader это выглядит такниже одного: -

{"feature":{"id":"888888","name":"A9 Refresh Release"}}

Вот мой код:

    BufferedReader in = new BufferedReader(newInputStreamReader(connection.getInputStream()));
    StringBuilder build = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
         build.append(inputLine); }
    in.close();
ObjectMapper mapper = new ObjectMapper();
Feature wrap = mapper.readValue(build, Feature.class);

Моя проблема не в том, что я не знаю, как маршалировать строку JSON вPOJO, но ответ JSON, полученный от HttpURLConnection, недействителен для ObjectMapper.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я нашел свою проблему.ObjectMapper.readValue(Sting a, valyetype) как указано, принимает только строки.Я отправлял StringBuilder.StringBuilder не будет форматировать мой JSON, но String будет.Простое исправление

Feature wrap = mapper.readValue(build.toString(), Feature.class);
0 голосов
/ 15 ноября 2018

На самом деле, вы должны сначала проанализировать строку JSON в JsonNode Джексона .

public <T> T readValue(JsonParser jp,
              Class<T> valueType)
            throws IOException,
                   JsonParseException,
                   JsonMappingException

Метод десериализации содержимого JSON в неконтейнерный тип (однако это может быть тип массива): обычно это bean-компонент, массив или тип-оболочка (например, Boolean).

Примечание: этот метод НЕ следует использовать, если типом результата является контейнер (Коллекция или Карта). Причина в том, что из-за стирания типа нельзя использовать интроспективные типы ключей и значений при использовании этого метода.

В конце концов, есть 2 решения вашей проблемы, как показано ниже: -

1. Быстрый разбор: -

BufferedReader in = new BufferedReader(newInputStreamReader(connection.getInputStream()));
    StringBuilder build = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
         build.append(inputLine); }
         in.close();
    ObjectMapper mapper = new ObjectMapper();
    Feature wrap = mapper.readValue(mapper.readTree(build), Feature.class);

2. Разбор низкого уровня: -

BufferedReader in = new BufferedReader(newInputStreamReader(connection.getInputStream()));
    StringBuilder build = new StringBuilder();
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
         build.append(inputLine); }
         in.close();
    ObjectMapper mapper = new ObjectMapper();
    JsonFactory factory = mapper.getFactory();
    JsonParser parser = factory.createParser(build);
    Feature wrap = mapper.readValue(mapper.readTree(parser), Feature.class);
...