一、問題描述
項目中要求商品金額字段在頁面上使用 ¥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