serialize example java json jackson

java - example - Establecer los valores predeterminados para null campos al mapear con Jackson



objectmapper java (5)

Haga que el miembro sea privado y agregue un par de setter / getter. En su setter, si es nulo, entonces configure el valor predeterminado en su lugar. Además, he mostrado el fragmento con el getter que también devuelve un valor predeterminado cuando el valor interno es nulo.

class JavaObject { private static final String DEFAULT="Default Value"; public JavaObject() { } @NotNull private String notNullMember; public void setNotNullMember(String value){ if (value==null) { notNullMember=DEFAULT; return; } notNullMember=value; return; } public String getNotNullMember(){ if (notNullMember==null) { return DEFAULT;} return notNullMember; } public String optionalMember; }

Estoy tratando de asignar algunos objetos JSON a objetos Java con Jackson. Algunos de los campos en el objeto JSON son obligatorios (que puedo marcar con @NotNull ) y algunos son opcionales.

Después del mapeo con Jackson, todos los campos que no están establecidos en el objeto JSON tendrán un valor nulo en Java. ¿Hay alguna anotación similar a @NotNull que le @NotNull a Jackson que establezca un valor predeterminado para un miembro de la clase Java, en caso de que sea nulo?

Editar: para hacer la pregunta más clara aquí hay un ejemplo de código.

El objeto de Java:

class JavaObject { @NotNull public String notNullMember; @DefaultValue("Value") public String optionalMember; }

El objeto JSON puede ser:

{ "notNullMember" : "notNull" }

o:

{ "notNullMember" : "notNull", "optionalMember" : "optional" }

Las anotaciones de @DefaultValue son solo para mostrar lo que estoy pidiendo. No es una anotación real. Si el objeto JSON es como en el primer ejemplo, quiero que el valor de optionalMember sea "Value" y no null . ¿Hay alguna anotación que haga tal cosa?


No hay anotación para establecer el valor predeterminado.
Puede establecer el valor predeterminado solo en el nivel de clase java:

public class JavaObject { public String notNullMember; public String optionalMember = "Value"; }


Parece que la solución es establecer el valor de las propiedades dentro del constructor predeterminado. Entonces, en este caso, la clase java es:

class JavaObject { public JavaObject() { optionalMember = "Value"; } @NotNull public String notNullMember; public String optionalMember; }

Después del mapeo con Jackson, si optionalMember falta en el JSON, su valor en la clase Java es "Value" .

Sin embargo, todavía estoy interesado en saber si hay una solución con anotaciones y sin el constructor predeterminado.


Solo una solución propuesta mantiene el default-value cuando se establece explícitamente some-value:null (la legibilidad POJO se pierde allí y es torpe)

Así es como uno puede mantener el default-value y nunca establecerlo como null

@JsonProperty("some-value") public String someValue = "default-value"; @JsonSetter("some-value") public void setSomeValue(String s) { if (s != null) { someValue = s; } }


Tuve un problema similar, pero en mi caso el valor predeterminado estaba en la base de datos. Debajo está la solución para eso:

@Configuration public class AppConfiguration { @Autowired private AppConfigDao appConfigDao; @Bean public Jackson2ObjectMapperBuilder builder() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() .deserializerByType(SomeDto.class, new SomeDtoJsonDeserializer(appConfigDao.findDefaultValue())); return builder; }

Luego, en SomeDtoJsonDeserializer use ObjectMapper para deserializar el json y establecer el valor predeterminado si su campo / objeto es nulo.