Ich erhalte diese Antwort vom Server {"status":"true","msg":"success"}
Ich versuche, diesen JSON-String mithilfe der Jackson-Parser-Bibliothek zu analysieren, aber irgendwie stehe ich vor einer Mapping-Ausnahme
com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: java.io.StringReader@421ea4c0; line: 1, column: 1]
Warum bekommen wir solche Ausnahmen?
Wie kann man verstehen, was diese Ausnahme verursacht?
Ich versuche auf folgende Weise zu analysieren:
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-Klasse
@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;
}
}
result
? Könnte es sein, dass Aufruf seingetResponseAsString
aufresult
zwei mal das Problem ist aufgrund der Art derresult
? Beispielsweise können Iteratoren in vielen Sprachen nicht zweimal durchlaufen werden.loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);
in(res, ...)
Antworten:
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(); }
Sie wissen nicht, wie es funktioniert hat und warum es funktioniert hat? :( aber es hat funktioniert
quelle
this method can be called several times yielding the same result each time
In meinem Fall wurde das Problem dadurch verursacht, dass ich einen Null-InputStream an den ObjectMapper.readValue-Aufruf übergeben habe:
ObjectMapper objectMapper = ... InputStream is = null; // The code here was returning null. Foo foo = objectMapper.readValue(is, Foo.class)
Ich vermute, dass dies der häufigste Grund für diese Ausnahme ist.
quelle
Ich könnte diesen Fehler beheben. In meinem Fall war das Problem auf Kundenseite. Aus Versehen habe ich den Stream, den ich auf den Server schrieb, nicht geschlossen. Ich habe den Stream geschlossen und es hat gut funktioniert. Selbst der Fehler klingt so, als ob der Server das Ende der Eingabe nicht identifizieren konnte.
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); out.write(jsonstring.getBytes()); out.close() ; //This is what I did
quelle
Ich hatte heute einen ähnlichen Fehler und das Problem war der inhaltliche Header der Post-Anfrage. Stellen Sie sicher, dass der Inhaltstyp Ihren Erwartungen entspricht. In meinem Fall
multipart/form-data
wurde stattdessen ein Header vom Typ Inhalt an die API gesendetapplication/json
.quelle
Das Problem für mich war, dass ich die Antwort zweimal wie folgt gelesen habe:
Die Antwort kann jedoch nur einmal gelesen werden, da es sich um einen Stream handelt.
quelle
In meinem Fall habe ich den Stream in einem Trikot-RequestEventListener gelesen, den ich auf der Serverseite erstellt habe, um den Anforderungshauptteil vor der Verarbeitung der Anforderung zu protokollieren. Dann wurde mir klar, dass dies wahrscheinlich dazu führte, dass beim anschließenden Lesen keine Zeichenfolge ausgegeben wurde (was beim Ausführen der Geschäftslogik übergangen wird). Ich habe das überprüft.
Wenn Sie also Streams zum Lesen der JSON-Zeichenfolge verwenden, achten Sie darauf.
quelle
Eine einfache Lösung könnte sein
Content-Type: application/json
Sie führen wahrscheinlich einen REST-API-Aufruf durch, um die Antwort zu erhalten.
Meistens stellen Sie
Content-Type: application/json
bei der Anfrage nicht ein.Content-Type: application/x-www-form-urlencoded
wird ausgewählt, was diese Ausnahme verursachen könnte.quelle
Ich weiß, dass dies seltsam ist, aber als ich GetMapping für Client- und Serverseite in PostMapping geändert habe , ist der Fehler verschwunden.
Sowohl Client als auch Server sind Spring-Boot-Projekte.
quelle
Ich habe diesen Fehler beim Senden einer GET-Anfrage mit dem Postboten erhalten. Die Anfrage erforderte keine Parameter. Mein Fehler war, dass ich eine leere Zeile im Anfragetext hatte.
quelle
Zum einen
@JsonProperty("status")
und@JsonProperty("msg")
sollte nur dort sein, wenn die Felder deklariert werden, nicht auf den Setzern und Getern.In der Tat wäre der einfachste Weg, dies zu analysieren,
@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; }
quelle