webentwicklung-frage-antwort-db.com.de

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Nicht erkanntes Feld

ich habe ein Deserialisierungsproblem: 

Das ist meine Klasse:

public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

die JSON, die ich deserialisieren möchte, ist:

{"ResObj":{"ClientNum":"12345","ServerNum":"78945","IdNum":"020252"},"ResInt":0}

Ich bekomme diese Ausnahme:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ResObj" , not marked as ignorable (0 known properties: ])
 at [Source: [email protected]; line: 1, column: 20] (through reference chain: ["ResObj"])

Ich möchte nicht hinzufügen:

@JsonIgnoreProperties(ignoreUnknown = true)

weil ich die resObj bekommen will ...

wenn ich die Annotation hinzufüge, wird sie übergeben, aber sie wird auf null gesetzt. Das will ich nicht.

12
user2212726

Wenn Sie in Ihrem Bean keine Setter verwenden möchten und nur Felder und Getter verwenden, können Sie die Sichtbarkeitsprüfung von ObjectMapper verwenden, um die Sichtbarkeit von Feldern zu ermöglichen. Etwas wie folgt

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
36
Jay

Sie benötigen Setter-Methoden, damit Jackson die Eigenschaften festlegen kann, und Sie müssen die Felder im Json ändern, um mit einem Kleinbuchstaben zu beginnen:

public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public void setResObj(Object ResObj) {
        this.ResObj = ResObj;
    }

    // ...
}

und:

{"resObj":{"clientNum":"12345","serverNum":"78945","idNum":"020252"},"resInt":0}

Der Grund für die JSON-Änderung ist, dass die Jackson-Bean-Serialisierung über die Klasse reflektiert wird. Wenn die Methoden getXyz () und setXyz () angezeigt werden, ordnen sie diese einem Json-Dateinamen "xyz" (und nicht "Xyz") zu.

Ich denke, es gibt mehrere Möglichkeiten, dieses Verhalten zu überschreiben. Eine davon ist die der Jackson-Anmerkungen.

7
jon-hanson

Ich denke, du solltest es versuchen

public class Response {
    @JsonProperty
    private Object ResObj;
    @JsonProperty
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

Es wird Ihr Problem mit UnrecognizedPropertyExceptions beheben

3
Ashish Patel

Sie müssen eine weitere Klasse für die Informationen in ResObj definieren {"ClientNum": "12345", "ServerNum": "78945", "IdNum": "020252"}. Andernfalls kann Jackson nicht bestimmen, wie dererialisiert werden soll.

0
user3588826

Ich habe dieses Problem mit der Jackson-Bibliothek gelöst. Hier ist mein Code-Ausschnitt.

**Main Class with JSON String in all lower case:**

 public class MainClass {

public static void main(String[] args) throws JsonParseException, 
    JsonMappingException, IOException {

    String jsonStr = "{\r\n" + "    \"resObj\": {\r\n" + "      \"clientNum\": 
               \"12345\",\r\n"
            + "     \"serverNum\": \"78945\",\r\n" + "      \"idNum\": 
          \"020252\"\r\n" + "   },\r\n"
            + " \"resInt\": 0\r\n" + "}";

    ObjectMapper mapper = new ObjectMapper();

    MyPojo details = mapper.readValue(jsonStr, MyPojo.class);

    System.out.println("value of clientNum: " + details.getResObj().getClientNum());
    System.out.println("value of getServerNum: " + 
               details.getResObj().getServerNum());
    System.out.println("value of getIdNum: " + details.getResObj().getIdNum());
    System.out.println("value of getResInt: " + details.getResInt());

} }

**MyPojo Class:**

 public class MyPojo {
private ResObj resObj;

private String resInt;

public ResObj getResObj() {
    return resObj;
}

  public String getResInt() {
       return resInt;   } }

**ResObj class:**


public class ResObj {
private String serverNum;

private String idNum;

private String clientNum;

public String getServerNum() {
    return serverNum;
}

public String getIdNum() {
    return idNum;
}

public String getClientNum() {
    return clientNum;
} }

**RESULT**

  value of clientNum: 12345
  value of getServerNum: 78945
  value of getIdNum: 020252
  value of getResInt: 0

NOTE: I have removed Setters in classes & there is no effect on the result.
0
Lucky
public class Response {
    public Object ResObj;
    public int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

Verwenden Sie diese Option, um das obige Problem zu beheben.

0
Bhupesh Kumar