最近作項目中,使用了json格式在服務器之間進行數據傳輸。可是發現json格式數據不符合JAVA中的變量定義規則,而且難以理解,所以須要在後臺中作二次處理,將數據處理成咱們系統中定義的格式。java
思路:json
1. 定義須要返回的bean,bean中定義須要返回的數據服務器
2. 獲取到須要處理的JSON字符串性能
3. 將JSON字符串轉換爲bean, 再將轉換後的bean返回給客戶端。測試
因爲json中的key與bean中的屬性不能匹配,所以在轉換過程當中出現了部分屬性爲null的狀況。通過查看官方文檔,發現可使用@JSONField進行解釋,可是並無詳細的使用說明。this
@JSONField的做用對象:spa
1. Field
2. Setter 和 Getter方法.net
注:FastJson在進行操做時,是根據getter和setter的方法進行的,並非依據Field進行。code
Show me the code:對象
1、做用Field
@JSONField做用在Field時,其name不只定義了輸入key的名稱,同時也定義了輸出的名稱。
代碼以下:
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; public class Person { @JSONField(name="name") private String name; @JSONField(name="age") private String age; @JSONField(name="desc") private String desc; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public void setNAME(String NAME) { //沒有生效,字段上註解中的name的值爲"name",則setter爲setName this.name = NAME; } public void setAGE(String AGE) { //沒有生效,字段上註解中的name的值爲"name",則setter爲setAge this.age = AGE; } public void setDESC(String DESC) { //沒有生效,字段上註解中的name的值爲"name",則setter爲setDesc this.desc = DESC; } public String toString() { return JSONObject.toJSONString(this); } }
輸出以下:
bean to json:{"age":"20","desc":"只是一個測試","name":"xianglj"} 須要轉換的json:{"AGE":"20","DESC":"只是一個測試","NAME":"XIANGLJ"} json to bean:null
從上面咱們能夠看出,當@JSONField做用在Fileld上時,定義了輸入和輸出,若是咱們傳輸過來的json格式不符合這個格式時,則不可以正確轉換。
2、做用在setter和getter方法上
顧名思義,看成用在setter方法上時,就至關於根據 name 到 json中尋找對應的值,並調用該setter對象賦值。
看成用在getter上時,在bean轉換爲json時,其key值爲name定義的值。實例以下:
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; public class Product { private String productName; private String desc; private String price; @JSONField(name="name") public String getProductName() { return productName; } @JSONField(name="NAME") public void setProductName(String productName) { this.productName = productName; } @JSONField(name="desc") public String getDesc() { return desc; } @JSONField(name="DESC") //測試代碼中對jsonStr有一個toUpperCase的操做。就會這與"DESC"匹配 public void setDesc(String desc) { this.desc = desc; } @JSONField(name="price") public String getPrice() { return price; } @JSONField(name="PRICE") public void setPrice(String price) { this.price = price; } public String toString() { return JSONObject.toJSONString(this); } }
import org.java.json.fastjson.bean.Product; import org.junit.Test; import com.alibaba.fastjson.JSONObject; /** * 對fastjson中的JSON轉換作一個測試 */ public class JsonObjectTest { public static void main(String[] args) { Product product = new Product(); product.setProductName("產品"); product.setDesc("這是一個產品"); product.setPrice("22.3"); String jsonStr = JSONObject.toJSONString(product); System.out.println("轉換爲json:" + JSONObject.toJSONString(product)); //jsonStr = jsonStr.toUpperCase(); System.out.println(jsonStr); product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class); System.out.println(product.toString()); } @Test public void test() { Product product = new Product(); product.setProductName("產品"); product.setDesc("這是一個產品"); product.setPrice("22.3"); String jsonStr = JSONObject.toJSONString(product); System.out.println("轉換爲json:" + JSONObject.toJSONString(product)); jsonStr = jsonStr.toUpperCase(); System.out.println(jsonStr); product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class); System.out.println(product.toString()); } }
輸出以下:
轉換爲json:{"desc":"這是一個產品","name":"產品","price":"22.3"} {"DESC":"這是一個產品","NAME":"產品","PRICE":"22.3"} {"desc":"這是一個產品","name":"產品","price":"22.3"}
有了這個註解以後,咱們在轉換bean時,就不須要在手工方式,爲不能轉換的屬性進行賦值。即便之後返回數據反生變化,也可以快速的進行修改。不用修改大片代碼。只須要修改註解name值就能夠了。
這個註解使用就到這裏,但願你們喜歡,支持
http://blog.csdn.net/u011425751/article/details/51219242
fastjson是一款由阿里巴巴提供的性能出色的json序列化與反序列化庫,並且使用很方便,咱們可使用JSON.toJSONString(object)將一個對象序列化爲json格式,可是若是咱們不想把一個類的全部成員都序列化怎麼辦呢。
解決這個問題有兩種方式:
1.給不想被序列化的屬性增長transient屬性---java特性
2.給不想被序列化的屬性增長增減JSONField(serialize=false)---fastjson特性
友情提醒一下:
因爲fastjson低版本存在反序列化漏洞,建議你們用較新版本,至少在1.2.28版本以上吧
---------------------
做者:johnHuster
來源:CSDN
原文:https://blog.csdn.net/john1337/article/details/76276073
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
做用:在json序列化時將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
使用方法:通常標記在屬性或者方法上,返回的json數據即不包含該屬性。
場景模擬:
須要把一個List<HistoryOrderBean>轉換成json格式的數據傳遞給前臺。但實體類中基本屬性字段的值都存儲在快照屬性字段中。此時我能夠在業務層中作處理,把快照屬性字段的值賦給實體類中對應的基本屬性字段。最後,我但願返回的json數據中不包含這兩個快照字段,那麼在實體類中快照屬性上加註解@JsonIgnore,那麼最後返回的json數據,將不會包含goodsInfo和extendsInfo兩個屬性值。
public class HistoryOrderBean {
//基本屬性字段
private String insurantName;
private String insuranceName;
private String insurancePrice;
private String insurancePicture;
private String insuranceLimit;
//快照屬性字段
@JsonIgnore
private String goodsInfo; //快照基本信息
@JsonIgnore
private String extendsInfo; //快照擴展屬性信息
}4.註解失效: 若是註解失效,多是由於你使用的是fastJson,嘗試使用對應的註解來忽略字段,註解爲:@JSONField(serialize = false),使用方法同樣。--------------------- 做者:fakerswe 來源:CSDN 原文:https://blog.csdn.net/fakerswe/article/details/78626085 版權聲明:本文爲博主原創文章,轉載請附上博文連接!