最近做項目中,使用了json格式在服務器之間進行數據傳輸。但是發現json格式數據不符合JAVA中的變量定義規則,並且難以理解,因此需要在后台中做二次處理,將數據處理成我們系統中定義的格式。
思路:
1. 定義需要返回的bean,bean中定義需要返回的數據
2. 獲取到需要處理的JSON字符串
3. 將JSON字符串轉換為bean, 再將轉換后的bean返回給客戶端。
由於json中的key與bean中的屬性不能匹配,因此在轉換過程中出現了部分屬性為null的情況。經過查看官方文檔,發現可以使用@JSONField進行解釋,但是並沒有詳細的使用說明。
@JSONField的作用對象:
1. Field
2. Setter 和 Getter方法
注:FastJson在進行操作時,是根據getter和setter的方法進行的,並不是依據Field進行。
Show me the code:
一、作用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格式不符合這個格式時,則不能夠正確轉換。
二、作用在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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!