2016-11-08 1 views
3

Я пытаюсь десериализовать массив байтов в java-тип с помощью mapper-объекта jackson.Jackson Object Mapper readvalue в байтах, возвращающий объект со всеми полями, инициализированными нулем

@JsonIgnoreProperties(ignoreUnknown = true) 
    @JsonInclude(JsonInclude.Include.NON_NULL) 
    public class A { 
    String s; 
    String b; 
    } 

    @JsonIgnoreProperties(ignoreUnknown = true) 
    @JsonInclude(JsonInclude.Include.NON_NULL) 
    public class B { 
    String c; 
    String b; 
    } 

     @JsonIgnoreProperties(ignoreUnknown = true) 
     @JsonInclude(JsonInclude.Include.NON_NULL) 
     public class C { 
     List<CustomType> x; 
     } 

и с использованием метода Джексоном,

objectMapper.readValue(byte[] data, Class<T> type). 

Как я не уверен, что объект массив содержит, я хочу ему потерпеть неудачу, когда он не может создать объект указанного типа. Однако objectMapper возвращает объект со всеми полями, инициализированными нулем. Как избежать такого поведения?

Ex: 
byte[] b; //contains Class B data 
byte[] a; //contains Class A data 
byte[] c// contains Class C data 
A a = objectMapper.readValue(c, A.class) is returning 
{s=null, b = null} 

и это вл я настроен ObjectMapper,

@Bean 
    public ObjectMapper objectMapper(HandlerInstantiator handlerInstantiator) { 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     builder.handlerInstantiator(handlerInstantiator); 
     builder.failOnEmptyBeans(false); 
     builder.failOnUnknownProperties(false); 
     builder.simpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
     builder.timeZone("UTC"); 
     builder.serializationInclusion(JsonInclude.Include.NON_NULL); 

     return builder.build(); 
    } 
+1

Пожалуйста, предоставьте [mcve]. –

+1

@SotiriosDelimanolis благодарит за ответ. Я включил все необходимое для воспроизведения. для простоты я удалил геттеры и сеттеры для объектов java. – Bharath

+1

@Bharath Нет, вы этого не сделали. – lexicore

ответ

1

objectMapper возвращает объект со всеми полями, инициализированными нулем. Как избежать этого?

Поля в объекте ввода, соответствующие целевому классу, не будут иметь значение null. Поэтому убедитесь, что есть соответствующие поля (поля с тем же именем).

Если вы не хотите иметь нуль, вы можете иметь значения по умолчанию для этих полей. Это может быть сделано

  • при полевой декларации String s="default value";
  • по умолчанию, без параметров. Джексон вызовет этот конструктор, а затем установит значения для сопоставления полей из данных JSON.

Если ваш источник json совершенно другой, а не одно совпадающее поле, тогда вы получите объект, где каждое поле равно null.

+1

thats wat я спрашиваю. Как избежать такого поведения возврата объекта со всеми нулевыми значениями. – Bharath

+0

@Bharath, я продлил свой ответ, чтобы ответить на ваш вопрос. –

2

@JsonIgnoreProperties(ignoreUnknown = true) говорит, что вы игнорировать неизвестные свойства. Поэтому, если вы отмените данные B как A, объект c игнорируется, просто не заполняется, поэтому вы получаете null.

Удалить аннотацию и вы должны начать получать JsonMappingException или аналогичные.

@JsonInclude(JsonInclude.Include.NON_NULL) предназначен для сериализации.

+1

, если он не может разрешить какое-либо из полей, тогда он возвращает объект со значениями, инициализированными нулем. Однако, если разрешены только некоторые из полей, это порождает исключение. Как я обрабатываю сценарий 1? – Bharath

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