property jsonvalue jsonrawvalue jsonproperty deserialize annotation java serialization jackson

jsonvalue - Java a Jackson JSON serialización: campos de dinero



jsonrawvalue (5)

Actualmente estoy usando Jackson para enviar los resultados de JSON desde mi aplicación web basada en Spring.

El problema que tengo es tratar de hacer que todos los campos de dinero salgan con 2 decimales. No pude resolver este problema usando setScale (2), ya que los números como 25.50 están truncados a 25.5, etc.

¿Alguien más ha lidiado con este problema? Estaba pensando en hacer una clase Money con un serializador Jackson personalizado ... ¿puedes crear un serializador personalizado para una variable de campo? Probablemente pueda ... Pero aún así, ¿cómo podría obtener mi serializador de clientes para agregar el número como un número con 2 decimales?


En lugar de configurar @JsonSerialize en cada miembro o getter, puede configurar un módulo que use un serializador de custome para un cierto tipo:

SimpleModule module = new SimpleModule(); module.addSerializer(BigInteger.class, new ToStringSerializer()); objectMapper.registerModule(module);

En el ejemplo anterior, utilicé el serializador de cadenas para serializar BigIntegers (ya que javascript no puede manejar dichos valores numéricos).


Puede usar la anotación @JsonFormat con shape como STRING en sus variables BigDecimal . Consulte a continuación:

import com.fasterxml.jackson.annotation.JsonFormat; class YourObjectClass { @JsonFormat (shape=JsonFormat.Shape.STRING) private BigDecimal yourVariable; }


Puede usar un serializador personalizado en su campo monetario. Aquí hay un ejemplo con un MoneyBean. El monto del campo se anota con @JsonSerialize (usando = ...) .

public class MoneyBean { //... @JsonProperty("amountOfMoney") @JsonSerialize(using = MoneySerializer.class) private BigDecimal amount; //getters/setters... } public class MoneySerializer extends JsonSerializer<BigDecimal> { @Override public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { // put your desired money style here jgen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_UP).toString()); } }

Eso es. Un BigDecimal ahora se imprime de la manera correcta. Usé un testcase simple para mostrarlo:

@Test public void jsonSerializationTest() throws Exception { MoneyBean m = new MoneyBean(); m.setAmount(new BigDecimal("20.3")); ObjectMapper mapper = new ObjectMapper(); assertEquals("{/"amountOfMoney/":/"20.30/"}", mapper.writeValueAsString(m)); }


Soy uno de los mantenedores de jackson-datatype-money , así que tome esta respuesta con un grano de sal ya que estoy ciertamente predispuesto. El módulo debe cubrir sus necesidades y es bastante ligero (sin dependencias de tiempo de ejecución adicionales). Además, se menciona en los documentos de Jackson , en los documentos de Spring e incluso hubo algunas discusiones sobre cómo integrarlo en el ecosistema oficial de Jackson.


Tuve el mismo problema y lo tuve formateado en JSON como una cadena en su lugar. Podría ser un truco pero es fácil de implementar.

private BigDecimal myValue = new BigDecimal("25.50"); ... public String getMyValue() { return myValue.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); }