Kein zu ordnender Inhalt aufgrund des Jackson-Parsers am Ende der Eingabe


76

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

2
Dies kann auch durch ein Verbindungszeitlimit verursacht werden. Wenn der Client eine Antwort vom Server erwartet, der HTTP-Connector jedoch eine Zeitüberschreitung aufweist, die überschritten wird, wird eine "leere" Antwort für das Zeitlimit zurückgegeben, die diese Fehlermeldung verursachen kann, wenn versucht wird, in json zu analysieren. Die Korrektur hierfür variiert - aber die Verlängerung der Zeitüberschreitung ist eine vorübergehende Korrektur.
Phas1c

Was war die Art von result? Könnte es sein, dass Aufruf sein getResponseAsStringauf resultzwei mal das Problem ist aufgrund der Art der result? Beispielsweise können Iteratoren in vielen Sprachen nicht zweimal durchlaufen werden.
Manu Chadha

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

Antworten:


30
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


13
Denken Sie, das liegt daran, dass beim Aufrufen von getResponseAsString () alle Bytes aus der Antwort gelesen und die Verbindung geschlossen werden. Das ist, warum es Ausnahme werfen kann
Koloritnij

5
Dies funktioniert aufgrund der von Ihnen ersetzten Zeichenfolge und nicht aufgrund von Feature.AUTO_CLOSE_SOURCE ....
Abdeali Chandanwala

2
Ich denke, Sie verdienen Upvote für "Weiß nicht, wie es funktioniert hat und warum es funktioniert hat? :( aber es hat funktioniert" Ehrliche Brache ... Gruß ....
Mayur

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

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

7

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.


2
Mein Grund war eine leere Zeichenfolge. Gleiches
Shervin Asgari

6

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

1

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-datawurde stattdessen ein Header vom Typ Inhalt an die API gesendet application/json.


1

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.


0

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.


0

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/jsonbei der Anfrage nicht ein. Content-Type: application/x-www-form-urlencodedwird ausgewählt, was diese Ausnahme verursachen könnte.


0

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.


0

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.


-3

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;

}

aber wie wird dies die Mapping-Ausnahme lösen? Und wie kann ich ohne Getter und Setter auf die arsed-Werte zugreifen, um sie weiter zu verwenden?
Swapnil

Sie können die Getter und Setter weiterhin ohne die Anmerkung hinzufügen. Ich denke, Ihre Anmerkung verwirrt den Mapper.
Katerina A.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.