serialize example convertir java json jackson

java - example - Desarlización de jackson: dos claves en la raíz. ¿Cómo desenvuelvo uno e ignoro al otro?



objectmapper java (1)

usando jackson 2.x

la respuesta json se ve así:

{ "flag": true, "important": { "id": 123, "email": "[email protected]" } }

La tecla "marcar" no proporciona ninguna información útil. Me gustaría ignorar la tecla "marcar" y desenvolver el valor "importante" en una instancia de Importante.

public class Important { private Integer id; private String email; public Important(@JsonProperty("id") Integer id, @JsonProperty("email") String email) { this.id = id; this.email = email; } public String getEmail() { this.email } public Integer getId() { this.id } }

Cuando trato de agregar un @JsonRootName ("importante") a Importante y configuro el ObjectMapper con DeserializationFeature.UNWRAP_ROOT_VALUE, recibo una JsonMappingException:

El nombre de raíz ''bandera'' no coincide con el esperado (''importante'') para el tipo ...

Cuando elimino la clave / valor "flag" del JSON, el enlace de datos funciona bien. Obtengo el mismo resultado si agrego @JsonIgnoreProperties ("flag") a Important también.

ACTUALIZACIONES

clase actualizada ... que realmente pasará el paso de compilación

@JsonRootName("important") public static class Important { private Integer id; private String email; @JsonCreator public Important(@JsonProperty("id") Integer id, @JsonProperty("email") String email) { this.id = id; this.email = email; } public String getEmail() { return this.email; } public Integer getId() { return this.id; } }

prueba real:

@Test public void deserializeImportant() throws IOException { ObjectMapper om = new ObjectMapper(); om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); Important important = om.readValue(getClass().getResourceAsStream("/important.json"), Important.class); assertEquals((Integer)123, important.getId()); assertEquals("[email protected]", important.getEmail()); }

resultados:

com.fasterxml.jackson.databind.JsonMappingException: El nombre de raíz ''flag'' no coincide con el esperado (''importante'') para el tipo [simple type, class TestImportant $ Important]


Solo por la naturaleza del análisis de JSON en Jackson, me temo que no hay una manera fácil de manejar estos casos.

Desde mi punto de vista, es más fácil hacerlo con algún tipo de envoltorio.

Considera este código:

public static class ImportantWrapper { @JsonProperty("important") private Important important; public Important getImportant() { return important; } }

Y prueba real:

@Test public void deserializeImportant() throws IOException { ObjectMapper om = new ObjectMapper(); //note: this has to be present om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Important important = om.readValue(getClass().getResourceAsStream("/important.json"), ImportantWrapper.class) .getImportant(); assertEquals((Integer)123, important.getId()); assertEquals("[email protected]", important.getEmail()); }

Tenga en cuenta que @JsonRootName("important") es redundante y se puede eliminar en este caso.

Esto se ve algo feo, pero funciona perfectamente con un esfuerzo relativamente pequeño. También tales "envoltorios" pueden ser generados, pero esto es más como las cosas de la arquitectura.