Jackson 对货币字段的系列化实现

一、问题描述

     项目中要求商品金额字段在页面上使用 ¥10,000,000.00 方式进行展现。 首先想到了一个笨方法,就是新增货币的String 类型字段用以显示格式化后的金额。但是这种方式有一个缺点。。。 如果在你的实体类中有大量金额类型字段需要格式化显示,那么你就需要创建多个同等的String 字段并且编写转换代码完成数据输出。经过翻阅资料发现可以利用 Jackson 中的自定义类型序列化功能来实现这个需求。


二、代码部分

1. 实体类

public class Goods implements Serializable {

    private int id;

    private String goods_code;

    private String goods_name; // 中文名称

    private String goods_enname; // 英文名称

    private String imgurl;

    @JsonSerialize(using = MoneySerializer.class)
    private BigDecimal goods_price;

    @JsonSerialize(using = MoneySerializer.class)
    private BigDecimal original_price; // 原价

    private String keyword; // 关键字

    private int cate_id;

    private String cate_name; // 分类名称

    private String cate_en; // 英文分类名称

    private int kind_id;

    private int brand_id;

    private  String brand_name; // 品牌名称

    private int quality_id;

    private int color_id;

    private String size;

    private String content;

    private boolean is_Reserve;

    private Date add_time;

    private boolean is_sale;

    private boolean is_delete;

    private boolean is_price;

    private int sort;

    private boolean stock; // 是否有现货


    // some get and set。。。。
}

2. 类型转换器

/**
 * 货币格式化
 */
public class MoneySerializer extends JsonSerializer {

    @Override
    public void serialize(BigDecimal val, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        NumberFormat currency = NumberFormat.getCurrencyInstance();
        currency.setMinimumFractionDigits(2); //设置数的小数部分所允许的最小位数(如果不足后面补0)
        currency.setMaximumFractionDigits(2); //设置数的小数部分所允许的最大位数(如果超过会四舍五入)
        jsonGenerator.writeString(currency.format(val));
    }
}

3. 转换结果

Jackson 对货币字段的系列化实现_第1张图片


三、其他

    您可以配置使用特定类型的客户序列化程序的模块,而不是在每个成员或getter上设置@JsonSerialize:

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

     在上面的例子中,我使用字符串序列化器来序列化BigIntegers(因为javascript无法处理这样的数值)。

 

参考链接: http://landcareweb.com/questions/17773/java-to-jackson-jsonxu-lie-hua-moneyzi-duan

你可能感兴趣的:(java,Jackson,JSON,web前端,json序列化,Spring,序列化,REST)