java - jsonignore - json ignore property c#
Ignorar la propiedad al deserializar (3)
En el caso de que no posea o no pueda cambiar la clase agregando la anotación @JsonIgnore
, obtendría el resultado esperado al usar mixin a partir de la versión 2.5 en su implementación.
public abstract class HasMoneyMixin {
@JsonIgnore
public abstract Money getMoney();
}
configurar mapper para utilizar mixin,
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(HasMoney.class, HasMoneyMixin.class);
// avoid failing if all properties are empty
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Tengo una interfaz simple con getter y setter para una propiedad.
public interface HasMoney {
Money getMoney();
void setMoney(Money money);
}
Tengo otra clase UserAccount que implementa esta interfaz.
public class UserAccount implements HasMoney {
private Money money;
@Override
Money getMoney() // fill in the blanks
@Override
void setMoney(Money money) // fill in the blanks
}
Mi problema es que quiero serializar la propiedad de dinero pero ignorarla al deserializarla, es decir, no aceptar ningún valor del usuario para esta propiedad. He intentado @JsonIgnore en el configurador y @JsonIgnore (falso) en el getter, lo ignora pero lo hace mientras lo serializa también.
Intenté @JsonIgnore en el setter y @JsonProperty en el getter simplemente para decirle a Jackson que intentamos rastrear esta propiedad, que parece bloquear la aplicación cuando se envía la propiedad money al servidor y Jackson intenta deserializarla lanzando MalformedJsonException: no se puede construir objeto de tipo dinero.
Lo más extraño es que poner @JsonIgnore en el setter y @JsonProperty en el setter funciona en la mayoría de los casos cuando la propiedad es primitiva.
La versión 2.6.0+ permite que esto se realice con @JsonIgnoreProperties en el nivel de clase.
@JsonIgnoreProperties(value={ "money" }, allowGetters=true)
Eche un vistazo a este problema cerrado: https://github.com/FasterXML/jackson-databind/issues/95
Ok, entonces el comportamiento de @JsonIgnore fue cambiado radicalmente desde 1.9 en adelante (para el peor imo). Sin entrar en los detalles diabólicos de por qué su propiedad no se ignora durante la deserialización, intente este código para solucionarlo:
public class UserAccount implements HasMoney {
@JsonIgnore
private BigDecimal money;
// Other variable declarations, constructors
@Override
@JsonProperty
public BigDecimal getMoney() {
return money;
}
@JsonIgnore
@Override
public void setMoney(final BigDecimal money) {
this.money = money;
}
// Other getters/setters
}
Tenga en cuenta el uso de @JsonIgnore
en el campo: es necesario para una solución de trabajo.
Nota: dependiendo de su entorno y caso de uso, es posible que necesite una configuración adicional en su instancia de ObjectMapper, por ejemplo, USE_GETTERS_AS_SETTERS, AUTO_DETECT_GETTERS, AUTO_DETECT_SETTERS, etc.