web-dev-qa-db-fra.com

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Champ non reconnu

j'ai eu un problème de désérialisation: 

Ceci est ma classe:

public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

le JSON que je veux désérialiser est:

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

Je reçois cette exception:

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

Je ne veux pas ajouter:

@JsonIgnoreProperties(ignoreUnknown = true)

parce que je veux obtenir le ResObj ...

si j'ajoute l'annotation, elle passe mais elle sera définie comme nulle. Ce que je ne veux pas.

12
user2212726

Si vous ne voulez pas que le sélecteur soit défini dans votre bean et n'utilisez que des champs et des accesseurs, vous pouvez utiliser le vérificateur de visibilité d'ObjectMapper pour permettre la visibilité des champs. Quelque chose comme suivre

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

Vous avez besoin de méthodes Setter pour permettre à Jackson de définir les propriétés, et vous devez modifier les champs du json pour commencer par une lettre minuscule:

public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

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

    // ...
}

et:

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

La modification JSON s'explique par le fait que la sérialisation du bean Jackson sera répercutée sur la classe et que, lorsqu'elle verra les méthodes getXyz () et setXyz (), elles seront mappées à un nom Json "xyz" (et non "Xyz").

Je pense qu'il y a plusieurs façons de remplacer ce comportement. L'une consiste à utiliser l'une des annotations de Jackson.

7
jon-hanson

Je pense que tu devrais essayer ça

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

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

Cela résoudra votre problème avec UnrecognizedPropertyExceptions

3
Ashish Patel

Vous devez définir une autre classe pour les informations au sein de ResObj {"ClientNum": "12345", "ServerNum": "78945", "IdNum": "020252"}. Sinon, Jackson ne peut pas déterminer comment désérialiser.

0
user3588826

J'ai réglé ce problème en utilisant la bibliothèque Jackson. Voici mon extrait de code.

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

Utilisez ceci pour résoudre le problème ci-dessus.

0
Bhupesh Kumar