2016-11-01 4 views
1

В процессе десериализации (как я понимаю, это процесс преобразования данных JSON в объект Java), как я могу сказать Джексону, что когда он читает объект, который не содержит данных, его следует игнорировать?Как сказать Джексону игнорировать пустой объект во время десериализации?

Я использую Джексон 2.6.6 и 4.2.6 Spring

В данных JSON, полученный мой контроллер выглядит следующим образом:

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

Проблема в том, что объект «containedObject» интерпретируется как есть, и он создается. Поэтому, как только мой контроллер считывает данные JSON, он создает экземпляр типа объекта ContainedObject, но мне нужно, чтобы это было null.

Самое простое и быстрое решение будет то, что в JSON полученных данных, это значение будет нулевым, как это:

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

Но это не представляется возможным, так как я не в состоянии контролировать данные JSON, что отправляется мне.

Есть ли аннотация (like this explained here), которая работает для процесса десериализации и может быть полезна в моей ситуации?

Я оставляю представление моих классов для получения дополнительной информации:

Моего класса сущностей выглядят следующим образом:

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

//Contructor, getters and setters omitted 

} 

И мой содержали класс объектов следующим образом:

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

//Contructor, getters and setters omitted 

} 

ответ

2

Я бы использовал JsonDeserializer. Осмотрите поле, о котором идет речь, определите, есть ли оно emtpy и верните null, поэтому ваш ContainedObject будет пустым.

Что-то вроде этого (пола-псевдо):

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

    } 

то в вашей модели:

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

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

    //Contructor, getters and setters omitted 

} 

Надеется, что это помогает!

+0

Это было бы моим решением, если я все еще не найду аннотацию, которая выполняет эту работу. Спасибо! –

+0

Это решение, которое я использовал широко. Насколько я знаю, никакая аннотация не будет делать то, что вы достигнете с помощью этого Deserializer. – Mechkov

+0

@MauricioCampagner Не забудьте принять ответ, который был наиболее полезен для вашего вопроса. Спасибо – Mechkov

1

Вы можете Внедрить собственный десериализатор следующим образом:

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

    } 
} 
+0

Я попытался это, но он не работает.Я думаю, это потому, что поле известно, но оно пустое, поэтому Джексон не игнорирует его. Спасибо в любом случае –

+0

Хорошо, я отредактирую свой ответ –

+0

Я думаю, что этот ответ и Мечковы эквивалентны. Я использовал оба варианта, теперь я предпочитаю @JsonDeserialize, потому что он не требует расширения JsonDeserializer. – Christine

0

Подход 1: в основном используется. @JsonInclude используется для исключения свойств с пустыми/нулями/значениями по умолчанию. Используйте @JsonInclude (JsonInclude.Include.NON_NULL) или @JsonInclude (JsonInclude.Include.NON_EMPTY) согласно вашему требованию.

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

    } 

Более подробная информация о аннотациях ДЖЕКСОН: https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

подход 2: GSON

использование GSON (https://code.google.com/p/google-gson/)

+0

@JsonInclude не работает. Согласно документации, эта аннотация предназначена только для процесса сериализации Подход 2 полезен, но я хочу знать, есть ли способ сделать это с помощью аннотации Джексона –

Смежные вопросы