處理流程:第三方Json--反序列化實體--保存到本地數據庫--查詢數據--序列化Json數據供本公司調用。簡化爲:json--實體--json。java
遇到問題:web
1,把數據存到本地後,怎麼取數據,各層級之間怎麼關聯?數據庫
2,json--實體,反序列化,有的實體中數據爲null,未能解析到json數據?json
3,實體--json,序列化,有的實體中的字段(好比:解決問題1時,增長的字段id,recordId)不須要序列化Json數據,即不須要展現給用戶,如何不序列化?this
解決方法:spa
1,建立表結構時,增長兩個字段,id,recordId,id爲每一層的主鍵,recordId爲關聯字段,用外層的id,對應裏層recordId,讓每一層創建關聯關係,實現查詢。code
2,緣由:Json數據中key與實體中定義字段不匹配。orm
看一下:json數據中key用下劃線分割,而實體中定義變量時,形式爲駝峯格式,這時能夠正常解析,實體中對應屬性有值。blog
而Json中標紅的數據,用點分割(注意實體中不能直接定義用點分割的變量。),沒法反序列化到實體。接口
解決方案一:註解加到變量上,用@JSONField(name = " "),對應json中key。
解決方案二:註解加到方法上,把該註解@JSONField(name = " "),加到set/get方法上,關鍵是加到set仍是get方法上?結論是加到set方法上,能夠理解爲給實體中變量賦值,name值與json中key對應。
什麼狀況下:註解加到get方法上,實體序列化時,默認狀況下,實體--json,json中key爲實體中對應變量。若是想要別人調用接口獲取的json,與第三方保持一致,即有下劃線,能夠經過在get方法上加註解,轉化想要的json數據格式。
事例:
實體定義:
public class InputParametersSYS extends BasePojo { private BigDecimal recordId; private String partnerCode; private String idNumber; private String accountName; private String accountMobile; @JSONField(name = "mobile.name.id") private String mobileNameId;
Json數據:
"interfaces": [ { "details": [ { "result": { "result": 0, "success": true, "display": "一致" }, "input_parameters": { "id_number": "370404199006301915", "mobile.name.id": "mobile.name.id", "account_name": "皮晴晴", "account_mobile": "13333333333", "partner_code": "pinganhq" } } ], "type": "手機號三要素覈驗" },
3,
方案一:在對應的不須要顯示的字段上加註解@JSONFiled(serialize = false)
//@JsonIgnore @JSONField(serialize = false) private Integer id;
方案二:加@JsonIgnore註解。不過當id,recordId 定義爲int類型時,該註解不起做用。定義爲Integet類型時,該註解生效。
package com.alibaba.fastjson.annotation; public @interface JSONField { // 配置序列化和反序列化的順序,1.1.42版本以後才支持 int ordinal() default 0; // 指定字段的名稱 String name() default ""; // 指定字段的格式,對日期格式有用 String format() default ""; // 是否序列化 boolean serialize() default true; // 是否反序列化 boolean deserialize() default true; }
FieldInfo能夠配置在getter/setter方法或者字段上。例如:
public class A { private int id; @JSONField(name="ID") public int getId() {return id;} @JSONField(name="ID") public void setId(int value) {this.id = id;} }
public class A { @JSONField(name="ID") private int id; public int getId() {return id;} public void setId(int value) {this.id = id;} }
public class A { // 配置date序列化和反序列使用yyyyMMdd日期格式 @JSONField(format="yyyyMMdd") public Date date; }
public class A { @JSONField(serialize=false) public Date date; }
缺省fastjson序列化一個java bean,是根據fieldName的字母序進行序列化的,你能夠經過ordinal指定字段的順序。這個特性須要1.1.42以上版本。
public static class VO { @JSONField(ordinal = 3) private int f0; @JSONField(ordinal = 2) private int f1; @JSONField(ordinal = 1) private int f2; }