ventajas varios una suma sobrecargado sobrecarga que métodos metodos metodo firma estaticos ejemplo constructores con clase calculadora java json jackson

suma - varios metodos en una clase java



Deserializando JSON en objetos con métodos sobrecargados usando Jackson (3)

Estoy intentando deserializar un objeto JSON almacenado en CouchDb usando Jackson. Este objeto necesita deserializarse en un pojo que contenga métodos sobrecargados. Cuando intento recuperar el objeto del diván y hacer la deserialización obtengo la siguiente excepción:

org.ektorp.DbAccessException: org.codehaus.jackson.map.JsonMappingException: definiciones de setter conflictivas para la propiedad "multiplicador": com.db.commodities.framework.sdos.model.security.EqOpt # setMultiplier (1 params) vs com.db .commodities.framework.sdos.model.security.EqOpt # setMultiplier (1 params)

Traté de anotar al colocador que me gustaría que usara Jackson, pero parece que no funcionó.

@JsonProperty("multiplier") public void setMultiplier(SDOSAttribute multiplier) { this.multiplier = multiplier; } public void setMultiplier(double multiplier) { this.multiplier.setValue(String.valueOf(multiplier)); }

¿Cómo configuro Jackson para deserializar adecuadamente usando un método específico? ¿O me estoy acercando a este problema de la manera incorrecta?

EDITAR:

Hice los siguientes cambios. Esto parece funcionar, pero es un poco más feo. Si alguien tiene una mejor manera de hacerlo, siéntete libre de compartir y con mucho gusto lo aceptaré.

@JsonProperty("multiplier") protected void setMultiplierAttribute(SDOSAttribute multiplier) { this.multiplier = multiplier; } @JsonIgnore public void setMultiplier(double multiplier) { this.multiplier.setValue(String.valueOf(multiplier)); }


En Jackson> 2.4 usa directamente:

mapper.addMixIn(Foo.class, IgnoreFooSetValueIntMixIn.class);


En los casos donde @JsonIgnore no ayuda (actualmente tengo un caso así, pero todavía no estoy seguro del motivo), también es posible utilizar @XmlTransient.


No es necesario cambiar el nombre del método setter para evitar ambigüedades. De lo contrario, estás en el camino correcto con @JsonIgnore . Con @JsonIgnore en todos los métodos del mismo nombre para ignorar, el que se utiliza no necesita la anotación @JsonProperty .

Aquí hay un ejemplo simple para demostrar este punto.

input.json: {"value":"forty-two"}

Foo.java:

import java.io.File; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.ObjectMapper; public class Foo { String value; public String getValue() {return value;} public void setValue(String value) {this.value = value;} @JsonIgnore public void setValue(int value) {this.value = String.valueOf(value);} public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); Foo foo = mapper.readValue(new File("input.json"), Foo.class); System.out.println(mapper.writeValueAsString(foo)); } }

Si no quiere alterar los valores prístinos de POJO con una anotación Jackson, entonces puede usar un MixIn .

import java.io.File; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.map.ObjectMapper; public class Foo { String value; public String getValue() {return value;} public void setValue(String value) {this.value = value;} public void setValue(int value) {this.value = String.valueOf(value);} public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, IgnoreFooSetValueIntMixIn.class); Foo foo = mapper.readValue(new File("input.json"), Foo.class); System.out.println(mapper.writeValueAsString(foo)); } } abstract class IgnoreFooSetValueIntMixIn { @JsonIgnore public abstract void setValue(int value); }