Kein zuzuordnender Inhalt aufgrund des Jackson-Parsers am Ende der Eingabe

Lesezeit: 4 Minuten

Benutzer-Avatar
Swapnil Kadam

Ich bekomme diese Antwort vom Server {"status":"true","msg":"success"}

Ich versuche, diese JSON-Zeichenfolge mit der Jackson-Parser-Bibliothek zu analysieren, aber irgendwie stehe ich vor einer Zuordnungsausnahme

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 diese Art von 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;
    }
}

  • Dies kann auch durch eine Verbindungszeitüberschreitung verursacht werden. Wenn der Client eine Antwort vom Server erwartet, der HTTP-Connector jedoch eine überschrittene Zeitüberschreitung aufweist, gibt er eine „leere“ Antwort für die Zeitüberschreitung zurück, was diese Fehlermeldung verursachen kann, wenn versucht wird, in json zu parsen. Die Lösung dafür wird variieren – aber das Erhöhen des Timeout-Zeitraums ist eine temporäre Lösung.

    – Mattiavelli

    8. April 2019 um 17:57 Uhr

  • was war das für eine art result? Könnte es diese Berufung sein getResponseAsString an result zweimal ist das Problem aufgrund der Art von result? ZB können Iteratoren in vielen Sprachen nicht zweimal durchlaufen werden.

    – Manu Chadha

    22. August 2019 um 16:26 Uhr

  • Sie sollten diese Zeile ändern loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class); zu (res, ...)

    – Dmitri Zagorulkin

    17. Oktober 2019 um 9:29 Uhr


Benutzer-Avatar
Swapnil Kadam

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

  • Denken Sie, das liegt daran, dass beim Aufrufen von getResponseAsString() alle Bytes aus der Antwort gelesen und die Verbindung geschlossen werden. Deshalb kann es eine Ausnahme auslösen

    – Koloritnij

    1. Juni 2016 um 11:35 Uhr

  • Dies funktioniert wegen der von Ihnen ersetzten Zeichenfolge res und nicht wegen Feature.AUTO_CLOSE_SOURCE ….

    – Abdeali Chandanwala

    24. Januar 2018 um 14:06 Uhr

  • Ich denke, Sie verdienen Upvote für “Weiß nicht, wie es funktioniert hat und warum es funktioniert hat? 🙁 aber es hat funktioniert” Ehrliche Brache … Salute ….

    – Mayur

    7. Dezember 2018 um 7:31 Uhr

  • Nur ein Stück Code zu posten, ohne zu wissen, warum es das Problem behebt, verdient meine Ablehnung.

    – Dephinera

    7. Dezember 2018 um 11:29 Uhr

  • @Koloritnij Ich denke, dein Kommentar ist falsch: this method can be called several times yielding the same result each time

    – Vic Seedoubleyew

    24. April 2019 um 18:39 Uhr

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.

  • Mein Grund war eine leere Zeichenfolge. Gleiche Sache

    – Shervin Asgari

    18. März 2020 um 12:17 Uhr

  • Wie kann man diesen Null-Inputstream beheben?

    – B.Kingsun

    8. Februar um 3:58

Ich konnte diesen Fehler beheben. In meinem Fall lag das Problem auf der Clientseite. Aus Versehen habe ich den Stream, den ich auf den Server geschrieben habe, nicht geschlossen. Ich habe den Stream geschlossen und es hat gut funktioniert. Sogar der Fehler klingt so, als ob der Server das Ende der Eingabe nicht erkennen konnte.

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

Das Problem für mich war, dass ich die Antwort zweimal wie folgt gelesen habe:

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

Die Antwort kann jedoch nur einmal gelesen werden, da es sich um einen Stream handelt.

Benutzer-Avatar
jd96

Ich hatte heute einen ähnlichen Fehler und das Problem war der Content-Type-Header der Post-Anfrage. Stellen Sie sicher, dass der Inhaltstyp Ihren Erwartungen entspricht. In meinem Fall a multipart/form-data Content-Type-Header wurde stattdessen an die API gesendet application/json.

Benutzer-Avatar
Svend

Dieser Fehler verbirgt manchmal (oft?) das eigentliche Problem: Eine Fehlerbedingung könnte dazu führen, dass der Inhalt falsch ist, was dann nicht deserialisiert werden kann.

In meinem Fall habe ich heute HTTP-Aufrufe getätigt und es (dummerweise) versäumt, den HTTP-Statuscode zu überprüfen, bevor ich versuchte, den Hauptteil der Antwort zu entpacken => mein eigentliches Problem war tatsächlich, dass ich einen Authentifizierungsfehler hatte, der einen verursachte 401 Unauthorized mit einem leeren Körper zu mir zurückgeschickt werden. Da ich diesen leeren Körper direkt entpackt habe, ohne irgendetwas zu überprüfen, habe ich das bekommen No content to map due to end-of-inputohne einen Hinweis auf das Authentifizierungsproblem zu erhalten.

Benutzer-Avatar
DS.

Ich habe diesen Fehler beim Senden einer GET-Anforderung mit Postbote erhalten. Die Anforderung erforderte keine Parameter. Mein Fehler war, dass ich eine Leerzeile im Anfragetext hatte.

1282410cookie-checkKein zuzuordnender Inhalt aufgrund des Jackson-Parsers am Ende der Eingabe

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy