Возникли проблемы при чтении строки 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.
Вот что я получаю от ответа
это не говорит вам никакой лжи
почему ты так думаешь?
Извините, я смотрел не на тот JSON
Если это не JSON, то как мне создать ответ в виде строки JSON?
Не уверен, что вы спрашиваете, но на самом деле не связаны с json конкретно, строки, которые хотят содержать ", должны будут их экранировать
Возможный дубликат Как преобразовать следующую строку JSON в POJO
@Abhinav Очень близко, но я не создаю JSON вручную. Я делаю GET с моим HttpURLConnection. JSON предоставляется, как показано в моем String. Я не могу добавить остальную часть кода, так как для этого требуется ключ аутентификации
@Tags Что вы подразумеваете под Ответ JSON недействителен _? Не могли бы вы опубликовать это (_инвалидный ответ JSON), а также часть вашего вопроса?
Какой у вас класс Feature.class? Есть ли у него свойство «особенность», являющееся объектом? Я предполагаю, что класс Feature имеет только свойства id и name, поэтому вам нужно создать класс-оболочку. (Если ваш Feature.class на самом деле является оболочкой, игнорируйте этот комментарий)
@Abhinav вторая строка JSON, которую я опубликовал по своему вопросу, я получаю сообщение об ошибке. Первая строка JSON, которую я ввел вручную, работает. Очевидно, я хочу использовать строку JSON, которую я получаю из своего HTTP-запроса, но ответ - это вторая строка
@Selindek - это класс-оболочка, и он работает. Я просто не могу заставить его работать с моим HTTP-запросом. Ответ на мой вопрос.
Что такое сообщение об исключении?




Собственно, сначала вам нужно проанализировать строку 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)Я использую readValue: public <T> T readValue(String content, Class<T> valueType) throws IOException, JsonParseException, JsonMappingException { return (T) _readMapAndClose(_jsonFactory.createParser(content), _typeFactory.constructType(valueType)); }
Я нашел свою проблему. ObjectMapper.readValue(Sting a, valyetype), как указано, принимает только строки. Я отправлял StringBuilder. StringBuilder не будет форматировать мой JSON, но String будет. Простое исправление
Feature wrap = mapper.readValue(build.toString(), Feature.class);
{"feature":{"id":"888888","name":"A9 Refresh Release"}недействителенjson- попробуйте добавить другой}