首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义MonetaryAmount JSR354 / moneta数据库Json序列化格式

自定义MonetaryAmount JSR354 / moneta数据库Json序列化格式
EN

Stack Overflow用户
提问于 2017-05-17 19:39:23
回答 1查看 1.1K关注 0票数 1

我试图用MonetaryAmount字段作为字符串序列化POJO,但结果输出不符合规定的形状格式。

代码语言:javascript
复制
// org.javamoney:moneta:1.1 
// com.fasterxml.jackson.core:jackson-annotations:2.7.0
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "CBNOT_CHARGEBACK_AMOUNT"
})
public class TestMonetaryAmountJsonSerialization {
        @JsonProperty("CBNOT_CHARGEBACK_AMOUNT")
        @NotNull
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "¤#,##0.00", locale = "en_US")
        private final MonetaryAmount chargebackAmount = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(12.50).create();

        private static final ObjectMapper mapper = new ObjectMapper();

        @Test
        public void testThis() throws JsonProcessingException{
            String json = mapper.writeValueAsString(this);
            System.out.println(json);
            Assert.assertEquals("{\"CBNOT_CHARGEBACK_AMOUNT\":\"¤12.50\"}",json);
        }

}

OUTPUT: {"CBNOT_CHARGEBACK_AMOUNT":{"currency":{"context":{"empty":false,"providerName":"java.util.Currency"},"defaultFractionDigits":2,"currencyCode":"USD","numericCode":840},"number":12.5,"factory":{"defaultMonetaryContext":{"precision":0,"fixedScale":false,"amountType":"org.javamoney.moneta.Money","maxScale":63,"empty":false,"providerName":null},"maxNumber":null,"minNumber":null,"amountType":"org.javamoney.moneta.Money","maximalMonetaryContext":{"precision":0,"fixedScale":false,"amountType":"org.javamoney.moneta.Money","maxScale":-1,"empty":false,"providerName":null}},"context":{"precision":0,"fixedScale":false,"amountType":"org.javamoney.moneta.Money","maxScale":63,"empty":false,"providerName":null},"numberStripped":12.5,"zero":false,"negative":false,"negativeOrZero":false,"positive":true,"positiveOrZero":true}}

知道我做错什么了吗?我把厨房水槽扔在这里的代码中,只是为了说明性的目的和紧凑的演示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-17 22:48:54

JsonFormat是杰克逊定义的几个(反)序列化器中使用的注释(例如,DateTimeSerializerBaseNumberSerializers.Base和其他一些完整列表这里),它不是将任何对象转换为字符串的通用机制:

与大多数其他Jackson注释不同,注释没有特定的通用解释:相反,效果取决于正在注释的属性的数据类型(或者更具体地说,使用反序列化程序和序列化程序)。

除非为MonetaryAmount创建自定义序列化程序,或者使用使用此注释(以及它的pattern属性)的序列化程序,否则指定它不会有任何效果,但如果创建自定义序列化程序,则很可能不需要为不同字段指定不同模式的灵活性,只需使用固定的MonetaryAmountFormat或从MonetaryAmount对象构建必要的字符串即可。

例如

代码语言:javascript
复制
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "CBNOT_CHARGEBACK_AMOUNT"
})
public class TestMonetaryAmountJsonSerialization {
    @JsonProperty("CBNOT_CHARGEBACK_AMOUNT")
    @NotNull
    private final MonetaryAmount chargebackAmount = Monetary.getDefaultAmountFactory().setCurrency("USD").setNumber(12.50).create();

    private static final ObjectMapper mapper = new ObjectMapper();
    static {
        SimpleModule monetaryModule = new SimpleModule();
        monetaryModule.addSerializer(MonetaryAmount.class, new MonetaryAmountSerializer());
        mapper.registerModule(monetaryModule);
    }

    @Test
    public void testThis() throws JsonProcessingException {
        String json = mapper.writeValueAsString(this);
        System.out.println(json);
        Assert.assertEquals("{\"CBNOT_CHARGEBACK_AMOUNT\":\"$12.50\"}", json);
    }

    public static class MonetaryAmountSerializer extends JsonSerializer<MonetaryAmount> {
        public void serialize(MonetaryAmount monetaryAmount,
                              JsonGenerator jsonGenerator,
                              SerializerProvider serializerProvider) throws IOException {
            StringBuilder sb = new StringBuilder();
            MonetaryAmountDecimalFormatBuilder
                    .of("¤#,##0.00").withCurrencyUnit(monetaryAmount.getCurrency()).build()
                    .print(sb, monetaryAmount);
            jsonGenerator.writeString(sb.toString());
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44033459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档