web-dev-qa-db-fra.com

Comment dire à Jackson d'ignorer un objet vide pendant la désérialisation?

Lors du processus de désérialisation (qui, si j'ai bien compris, consiste à convertir des données JSON en un objet Java), comment puis-je dire à Jackson que lorsqu'il lit un objet qui ne contient aucune donnée, il doit être ignoré?

J'utilise Jackson 2.6.6 et Spring 4.2.6

Les données JSON reçues par mon contrôleur sont les suivantes:

{
    "id": 2,
    "description": "A description",
    "containedObject": {}
}

Le problème est que l'objet "ContentObject" est interprété tel quel et qu'il est en cours d'instanciation. Par conséquent, dès que mon contrôleur lit ces données JSON, il produit une instance du type d'objet ContainedObject, mais j'ai besoin que cela soit à la place de null.

La solution la plus simple et la plus rapide serait que, dans les données JSON reçues, cette valeur soit nulle, comme ceci:

 {
        "id": 2,
        "description": "A description",
        "containedObject": null
    }

Mais ce n'est pas possible car je ne contrôle pas les données JSON qui me sont envoyées.

Existe-t-il une annotation ( comme celle expliquée ici ) qui fonctionne pour le processus de désérialisation et pourrait être utile dans ma situation?

Je laisse une représentation de mes cours pour plus d'informations:

Ma classe d'entité est la suivante:

public class Entity {
    private long id;
    private String description;
    private ContainedObject containedObject;

//Contructor, getters and setters omitted

}

Et ma classe d'objets contenus comme suit:

public class ContainedObject {
    private long contObjId;
    private String aString;

//Contructor, getters and setters omitted

}
5

Je voudrais utiliser un JsonDeserializer. Inspectez le champ en question, déterminez s'il s'agit de emtpy et renvoyez null, afin que votre ContainedObject soit nul.

Quelque chose comme ça (semi-pseudo):

 public class MyDes extends JsonDeserializer<ContainedObject> {

        @Override
        public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
            //read the JsonNode and determine if it is empty JSON object
            //and if so return null

            if (node is empty....) {
                return null;
            }
            return node;
        }

    }

puis dans votre modèle:

 public class Entity {
    private long id;
    private String description;

    @JsonDeserialize(using = MyDes.class)
    private ContainedObject containedObject;

   //Contructor, getters and setters omitted

 }

J'espère que cela t'aides!

5
Mechkov

Vous pouvez implémenter un désérialiseur personnalisé comme suit: 

public class Entity {
    private long id;
    private String description;
    @JsonDeserialize(using = EmptyToNullObject.class)
    private ContainedObject containedObject;

//Contructor, getters and setters omitted

}


public class EmptyToNullObject extends JsonDeserializer<ContainedObject> {

  public ContainedObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    JsonNode node = jp.getCodec().readTree(jp);
    long contObjId = (Long) ((LongNode) node.get("contObjId")).numberValue();
    String aString = node.get("aString").asText();
    if(aString.equals("") && contObjId == 0L) {
      return null;
    } else {
      return new ContainedObject(contObjId, aString);
    }

  }
}
2

Approche 1: Ceci est principalement utilisé. @JsonInclude est utilisé pour exclure des propriétés avec des valeurs vides/null/par défaut.Utilisez @JsonInclude (JsonInclude.Include.NON_NULL) ou @JsonInclude (JsonInclude.Include.NON_EMPTY) selon vos besoins.

    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class Employee {

        private String empId;
        private String firstName;

        @JsonInclude(JsonInclude.Include.NON_NULL)
        private String lastName;
        private String address;
        private String emailId;

   }

Plus d'infos sur les annotations jackson: https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

Approche 2: GSON

utiliser GSON ( https://code.google.com/p/google-gson/ )

1
denzal