Нет содержимого для отображения из-за синтаксического анализа джексонов конца ввода
Я получаю этот ответ от сервера {"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;
}
}
Ответы
Ответ 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;
}