FastJson中@JSONField註解使用

最近作項目中,使用了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);  
    }  
}  

 

 

import org.java.json.fastjson.bean.Person;  
import org.junit.Before;  
import org.junit.Test;  
  
import com.alibaba.fastjson.JSONObject;  
  
public class PersonTest {  
  
    private Person person;  
      
    /**  
     * 初始化對象  
     */  
    @Before  
    public void setUp() {  
        person = new Person();  
        person.setName("xianglj");  
        person.setAge("20");  
        person.setDesc("只是一個測試");  
    }  
      
    @Test  
    public void test() {  
        String jsonStr = JSONObject.toJSONString(person);  
        System.out.println("bean to json:" + jsonStr);  
          
        //改變json的key爲大寫  
        jsonStr = jsonStr.toUpperCase();  
          
        System.out.println("須要轉換的json:" + jsonStr);  
        person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);  
        System.out.println("json to bean:" + person.getName());  
    }  
}  

輸出以下:

 
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 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索