FastJson中@JSONField注解使用


最近做項目中,使用了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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM