Немає вмісту для відображення через парсер джексона, що закінчується введенням


76

Я отримую цю відповідь від сервера {"status":"true","msg":"success"}

Я намагаюся проаналізувати цей рядок json за допомогою бібліотеки парсера Jackson, але я якось стикаюся із зазначенням винятку mapping

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: java.io.StringReader@421ea4c0; line: 1, column: 1]

Чому ми отримуємо подібні винятки?

Як зрозуміти, що викликає цей виняток?

Я намагаюся проаналізувати наступним чином:

StatusResponses loginValidator = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);

try {
    String res = result.getResponseAsString();//{"status":"true","msg":"success"}
    loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);
} catch (Exception e) {
    e.printStackTrace();
}

Клас StatusResponse

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "status","msg" })
public class StatusResponses {

    @JsonProperty("status")
    public String getStatus() {
        return status;
    }

    @JsonProperty("status")
    public void setStatus(String status) {
        this.status = status;
    }

    @JsonProperty("msg")
    public String getMessage() {
        return message;
    }

    @JsonProperty("msg")
    public void setMessage(String message) {
        this.message = message;
    }

    @JsonProperty("status")
    private String status;

    @JsonProperty("msg")
    private String message;

    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonGetter
    public Map<String, Object> getAdditionalProperties() {
        return additionalProperties;
    }

    @JsonSetter
    public void setAdditionalProperties(Map<String, Object> additionalProperties) {
        this.additionalProperties = additionalProperties;
    }
}

2
Це також може бути спричинено через час очікування з'єднання. Якщо клієнт очікує відповіді від сервера, але з'єднувач HTTP має перевищений період очікування - він поверне "порожню" відповідь на час очікування - що може спричинити це повідомлення про помилку при спробі аналізу json. Виправлення цього варіюватиметься, але збільшення періоду очікування є одним із тимчасових виправлень.
Phas1c

який був тип result? Може бути , що виклик getResponseAsStringв resultдва рази питання в зв'язку з типом result? Наприклад, ітератори багатьох мов неможливо пройти двічі.
Ману Чадха

Вам слід змінити цей рядок loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);на(res, ...)
Дмитро

Відповіді:


31
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;

StatusResponses loginValidator = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);

try {
    String res = result.getResponseAsString();//{"status":"true","msg":"success"}
    loginValidator = objectMapper.readValue(res, StatusResponses.class);//replaced result.getResponseAsString() with res
} catch (Exception e) {
    e.printStackTrace();
}

Не знаєте, як це працювало і чому це працювало? :( але це спрацювало


13
Думайте, це тому, що коли ви викликаєте getResponseAsString (), він зчитує всі байти з відповіді та тісного з’єднання. Ось чому це може спричинити виняток
Колоритний

5
Це працює через замінений вами рядок, а не через
функцію.AUTO_CLOSE_SOURCE

3
Думаю, ви заслуговуєте "За" за "Не знаю, як це працювало і чому воно працювало? :( але це спрацювало" Чесне перелог ... Салют ....
Mayur

6
Просто розміщення шматка коду, не знаючи, чому це вирішує проблему, заслуговує мого голосу проти.
dephinera

@Koloritnij Я думаю, що ваш коментар помилковий:this method can be called several times yielding the same result each time
Vic Seedoubleyew

7

У моєму випадку проблема була викликана моїм передаванням нульового InputStream виклику ObjectMapper.readValue:

ObjectMapper objectMapper = ...
InputStream is = null; // The code here was returning null.
Foo foo = objectMapper.readValue(is, Foo.class)

Я припускаю, що це найпоширеніша причина цього винятку.


2
Моєю причиною був порожній рядок. Те саме
Шервін Асгарі

6

Я міг виправити цю помилку. У моєму випадку проблема була на стороні клієнта. Помилково я не закрив потік, який писав на сервер. Я закрив потік, і він працював нормально. Навіть помилка звучить так, що сервер не зміг визначити кінець введення.

OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(jsonstring.getBytes());
out.close() ; //This is what I did

1

Сьогодні у мене сталася подібна помилка, і проблема полягала в заголовку вмісту запиту на публікацію. Переконайтеся, що тип вмісту відповідає вашим очікуванням. У моєму випадку multipart/form-dataзаголовок типу вмісту надсилався в API замість application/json.


1

Проблема для мене полягала в тому, що я прочитав відповідь двічі наступним чином:

System.out.println(response.body().string());
getSucherResponse = objectMapper.readValue(response.body().string(), GetSucherResponse.class);

Однак відповідь можна прочитати лише один раз, оскільки це потік.


0

У моєму випадку я читав потік у майці RequestEventListener, яку я створив на стороні сервера для реєстрації тіла запиту до того, як запит буде оброблений. Потім я зрозумів, що це, ймовірно, призвело до подальшого читання, що не дало жодного рядка (що передається під час запуску бізнес-логіки). Я переконався, що це так.

Отже, якщо ви використовуєте потоки для читання рядка JSON, будьте обережні з цим.


0

Це може бути просте виправлення Content-Type: application/json

Ймовірно, ви робите виклик REST API, щоб отримати відповідь.

Здебільшого ви не налаштовуєте Content-Type: application/jsonзапит. Content-Type: application/x-www-form-urlencodedбуде вибрано, що може спричинити цей виняток.


0

Я знаю, що це дивно, але коли я змінив GetMapping на PostMapping як для клієнта, так і для сервера, помилка зникла.

І клієнт, і сервер - це проект завантаження Spring.


0

Я отримав цю помилку під час надсилання запиту GET із листоношею. Запит не вимагав жодних параметрів. Моєю помилкою було те, що в тілі запиту був порожній рядок.


0

Ця помилка іноді (часто?) Приховує справжню проблему: стан помилки може спричинити неправильний вміст, який потім не вдається десеріалізувати.

У моєму випадку, на сьогоднішній день, я робив HTTP виклики і (здуру) опущено , щоб перевірити код стану HTTP , перш ніж намагатися розпакувати тіло відповіді => моєї реальною проблемою було actualy , що у мене були деякі помилки аутентифікації, що викликав 401 Unauthorizedбути відправлений до мене з порожнім тілом. Оскільки я демаршалізував це порожнє тіло безпосередньо, нічого не перевіряючи, я отримував це No content to map due to end-of-input, не отримуючи жодної підказки про проблему автентифікації.


-3

Для одного @JsonProperty("status")і@JsonProperty("msg") повинен бути там лише при оголошенні полів, а не на сетерах і гетерах.

Насправді, найпростіший спосіб проаналізувати це буде

@JsonAutoDetect  //if you don't want to have getters and setters for each JsonProperty
public class StatusResponses {

   @JsonProperty("status")
   private String status;

   @JsonProperty("msg")
   private String message;

}

але як це вирішить виняток зіставлення? І без геттерів та сеттерів, як я можу отримати доступ до задумчених значень для подальшого використання?
Swapnil

Ви все ще можете додавати геттери та сетери без анотації. Я думаю, що ваша анотація бентежить картографа.
Катерина А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.