Подтвердить что ты не робот

Нет содержимого для отображения из-за синтаксического анализа джексонов конца ввода

Я получаю этот ответ от сервера {"status":"true","msg":"success"}

Я пытаюсь проанализировать эту строку JSON с помощью библиотеки парсера Джексона, но каким-то образом я сталкиваюсь с выражением об исключении сопоставления

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: [email protected]; 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;
    }
}
4b9b3361

Ответ 1

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();
}

Не знаете, как это работает и почему это работает? :( но это сработало

Ответ 2

Я мог бы исправить эту ошибку. В моем случае проблема была на стороне клиента. По ошибке я не закрывал поток, который я писал на сервер. Я закрыл поток, и он работал нормально. Даже ошибка звучит так, как будто сервер не смог идентифицировать конец ввода.

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

Ответ 3

У меня была похожая ошибка сегодня, и проблема заключалась в заголовке типа содержимого запроса на публикацию. Убедитесь, что тип контента соответствует ожидаемому. В моем случае заголовок типа содержимого "multipart/form-data" отправлялся в API вместо "application/json".

Ответ 4

В моем случае я читал поток в Джерси RequestEventListener, который я создал на стороне сервера для записи тела запроса до обработки запроса. Затем я понял, что это, вероятно, привело к последующему чтению, которое не дало никакой строки (что передается при запуске бизнес-логики). Я подтвердил, что это так.

Поэтому, если вы используете потоки для чтения строки JSON, будьте осторожны с этим.

Ответ 5

В моем случае проблема была вызвана передачей пустого InputStream в вызов ObjectMapper.readValue:

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

Я предполагаю, что это самая распространенная причина этого исключения.

Ответ 6

Во-первых, @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;

}