一、问题描述
项目中要求商品金额字段在页面上使用 ¥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<BigDecimal> {
@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. 转换结果
三、其他
您可以配置使用特定类型的客户序列化程序的模块,而不是在每个成员或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