ObjectMapper не принимает ответ JSON от HttpURLConnection

Возникли проблемы при чтении строки 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.

{"feature":{"id":"888888","name":"A9 Refresh Release"} недействителен json - попробуйте добавить другой }
Scary Wombat 15.11.2018 02:23

Вот что я получаю от ответа

Tags 15.11.2018 02:23

это не говорит вам никакой лжи

Scary Wombat 15.11.2018 02:24

почему ты так думаешь?

Scary Wombat 15.11.2018 02:25

Извините, я смотрел не на тот JSON

Tags 15.11.2018 02:26

Если это не JSON, то как мне создать ответ в виде строки JSON?

Tags 15.11.2018 02:34

Не уверен, что вы спрашиваете, но на самом деле не связаны с json конкретно, строки, которые хотят содержать ", должны будут их экранировать

Scary Wombat 15.11.2018 02:38

Возможный дубликат Как преобразовать следующую строку JSON в POJO

Abhinav 15.11.2018 08:04

@Abhinav Очень близко, но я не создаю JSON вручную. Я делаю GET с моим HttpURLConnection. JSON предоставляется, как показано в моем String. Я не могу добавить остальную часть кода, так как для этого требуется ключ аутентификации

Tags 15.11.2018 16:53

@Tags Что вы подразумеваете под Ответ JSON недействителен _? Не могли бы вы опубликовать это (_инвалидный ответ JSON), а также часть вашего вопроса?

Abhinav 15.11.2018 17:02

Какой у вас класс Feature.class? Есть ли у него свойство «особенность», являющееся объектом? Я предполагаю, что класс Feature имеет только свойства id и name, поэтому вам нужно создать класс-оболочку. (Если ваш Feature.class на самом деле является оболочкой, игнорируйте этот комментарий)

Selindek 15.11.2018 17:04

@Abhinav вторая строка JSON, которую я опубликовал по своему вопросу, я получаю сообщение об ошибке. Первая строка JSON, которую я ввел вручную, работает. Очевидно, я хочу использовать строку JSON, которую я получаю из своего HTTP-запроса, но ответ - это вторая строка

Tags 15.11.2018 17:10

@Selindek - это класс-оболочка, и он работает. Я просто не могу заставить его работать с моим HTTP-запросом. Ответ на мой вопрос.

Tags 15.11.2018 17:13

Что такое сообщение об исключении?

Selindek 15.11.2018 17:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
14
1 786
2

Ответы 2

Собственно, сначала вам нужно проанализировать строку JSON в Jackson 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);
mapper.readTree(build) принимает только JsonNode. Объект build - это StringBuilder. Получение этой ошибки; The method readTree(JsonParser) in the type ObjectMapper is not applicable for the arguments (StringBuilder)
Tags 15.11.2018 18:46

Я использую readValue: public <T> T readValue(String content, Class<T> valueType) throws IOException, JsonParseException, JsonMappingException { return (T) _readMapAndClose(_jsonFactory.createParser(content), _typeFactory.constructType(valueType)); }

Tags 15.11.2018 19:27

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

Feature wrap = mapper.readValue(build.toString(), Feature.class);

Другие вопросы по теме