1019 Stimmen

Jackson mit JSON: Unerkanntes Feld, nicht als ignorierbar markiert

Ich muss eine bestimmte JSON-Zeichenfolge in ein Java-Objekt konvertieren. Ich verwende Jackson für die JSON-Verarbeitung. Ich habe keine Kontrolle über die JSON-Eingabe (ich lese von einem Webdienst). Dies ist meine Eingabe JSON:

{"wrapper":[{"id":"13","name":"Fred"}]}

Hier ist ein vereinfachter Anwendungsfall:

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

Meine Entitätsklasse ist:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

Meine Wrapper-Klasse ist im Grunde ein Container-Objekt, um meine Liste der Schüler zu erhalten:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

Ich erhalte immer wieder diesen Fehler und "wrapper" gibt zurück null . Ich bin mir nicht sicher, was fehlt. Kann mir bitte jemand helfen?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

11voto

ajith r Punkte 133

Beschriften Sie das Feld students wie folgt, da die Namen von json property und java property nicht übereinstimmen

public Class Wrapper {
    @JsonProperty("wrapper")
    private List<Student> students;
    //getters & setters here
}

11voto

TedTrippin Punkte 3425

Das Problem ist, dass Ihre Eigenschaft in Ihrem JSON "wrapper" heißt und Ihre Eigenschaft in Wrapper.class "students" heißt.

Also entweder...

  1. Korrigieren Sie den Namen der Eigenschaft entweder in der Klasse oder in JSON.
  2. Beschriften Sie Ihre Eigenschaftsvariable wie in StaxMan's Kommentar beschrieben.
  3. Kommentieren Sie den Setter (wenn Sie einen haben)

10voto

Irgendwie hat nach 45 Beiträgen und 10 Jahren noch niemand die richtige Antwort für meinen Fall gegeben.

@Data //Lombok
public class MyClass {
    private int foo;
    private int bar;

    @JsonIgnore
    public int getFoobar() {
      return foo + bar;
    }
}

In meinem Fall haben wir eine Methode namens getFoobar() , aber nein foobar Eigenschaft (weil sie aus anderen Eigenschaften berechnet wird). @JsonIgnoreProperties auf die Klasse funktioniert nicht.

Die Lösung besteht darin, die Methode mit folgenden Worten zu versehen @JsonIgnore

7voto

krmanish007 Punkte 6070

Eine andere Möglichkeit ist diese Eigenschaft in der Datei application.properties spring.jackson.deserialization.fail-on-unknown-properties=false die keine weiteren Code-Änderungen in Ihrer Anwendung erfordert. Und wenn Sie glauben, dass der Vertrag stabil ist, können Sie diese Eigenschaft entfernen oder als wahr markieren.

7voto

cwa Punkte 158

Dies ist vielleicht nicht das gleiche Problem, dass der OP hatte, aber für den Fall, dass jemand hier mit dem gleichen Fehler, den ich hatte, dann wird dies ihnen helfen, ihr Problem zu lösen. Ich bekam den gleichen Fehler wie der OP, wenn ich einen ObjectMapper aus einer anderen Abhängigkeit als die JsonProperty-Annotation verwendet.

Das funktioniert:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;

Funktioniert NICHT:

import org.codehaus.jackson.map.ObjectMapper; //org.codehaus.jackson:jackson-mapper-asl:1.8.8
import com.fasterxml.jackson.annotation.JsonProperty; //com.fasterxml.jackson.core:jackson-databind:2.2.3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X