【引言】
在開發中,不論是前后端聯調,還是與第三方對接,有時候難免會遇到對方定義的json數據中的key值與自己后端定義的實體字段不一致的情況,也有時候會遇到前端傳的日期數據需要進行格式轉換的問題。本篇博客接下來要總結的這個注解,可以很方便的處理我們的問題,下面就一起看看如何使用。
【實例】
一. @JsonField注解
JsonField注解是阿里開發的fastjson中的注解,代碼如下
// 若屬性是私有的,必須有set*方法。否則無法反序列化。 public @interface JSONField { // 配置序列化和反序列化的順序,1.1.42版本之后才⽀持 int ordinal() default 0; // 指定字段的名稱 String name() default ""; // 指定字段的格式,對⽇期格式有⽤ String format() default ""; // 是否序列化 boolean serialize() default true; // 是否反序列化 boolean deserialize() default true; }
可以配置在getter/setter⽅法或者字段上。我們項目中使用了Lombok插件,省去了get/set方法,所以直接配置在字段上使用,如下:
/** * 應收款 */ @JSONField(name = "YS") private BigDecimal receivables; /** * 付款方式 */ @JSONField(name = "FKFS") private String payType; /** * 確認操作員 */ @JSONField(name = "PER") private String person; ...
以上代碼中,JsonField注解中name中的值,諸如YS,PER等,就是與第三方對接返回給我們的數據字段以及我們調用其接口需要傳給他們的字段,我們的實體肯定不能按這樣的字段定義,我們也不能要求別人把接口都修改一遍,所以,使用這個注解,可以直接實現對方的json字段與我們實體的字段分別對應,也不需要做任何修改。
- 除了上面name的使用,JsonField還可以指定字段是否序列化,字段順序及字段的輸出格式,代碼示例如下:
//1. 指定字段不序列化 @JSONField(serialize=false) public Date date; //2. 指定字段順序 @JSONField(ordinal = 3) private int f0; @JSONField(ordinal = 2) private int f1; @JSONField(ordinal = 1) private int f2; //3. 配置date序列化和反序列使⽤yyyyMMdd⽇期格式 @JSONField(format="yyyyMMdd") public Date date;
關於FastJson屬性別名的問題,網上很多文章都指出@JSONField(name = "***")
必須要注解在setter和getter上面;
但是實際測試compile 'com.alibaba:fastjson:1.1.56'
版本的FastJson發現@JSONField注解其實可以直接寫到屬性名上面
JSONObject對象里字段排序問題
String student = JSONObject.toJSONString(student, SerializerFeature.SortField.MapSortField); //指定順序輸出,同時在 bean的屬性上標記 @JSONField(ordinal = 序號)
或者在插入Json元素的時候,先后排序可以直接在創建實例之時指定
JSONObject jsonObject = new JSONObject(true); jsonObject.put("a","1"); jsonObject.put("b","2"); jsonObject.put("c","3"); jsonObject.put("d","4"); jsonObject.put("e","5"); jsonObject.put("ac","6"); System.out.println(JSONObject.toJSONString(jsonObject);
ref: https://blog.csdn.net/hu_zhiting/article/details/85239765?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight