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進行。

 

介紹完@JSONField之後,針對以上場景,給出JAVA代碼

一、作用Field

       @JSONField作用在Field時,其name不僅定義了輸入key的名稱,同時也定義了輸出的名稱。代碼如下:

package org.java.json.fastjson.bean;
 
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) {
		this.name = NAME;
	}
	
	public void setAGE(String AGE) {
		this.age = AGE;
	}
	
	public void setDESC(String DESC) {
		this.desc = DESC;
	}
	
	public String toString() {
		return JSONObject.toJSONString(this);
	}
}
package org.java.json.fastjson.json;
 
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格式不符合這個格式時,則不能夠正確轉換。

 

二、作用在setter和getter方法上

顧名思義,當作用在setter方法上時,就相當於根據 name 到 json中尋找對應的值,並調用該setter對象賦值。

當作用在getter上時,在bean轉換爲json時,其key值爲name定義的值。實例如下:

<pre name="code" class="java">package org.java.json.fastjson.bean;
 
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")
	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);
	}
	
}
package org.java.json.fastjson.json;
 
import org.java.json.fastjson.bean.Product;
import org.junit.Test;
 
import com.alibaba.fastjson.JSONObject;
 
/**
 * 對fastjson中的JSON轉換做一個測試
 * @author xianglj
 */
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值就可以了。

 

轉載:https://blog.csdn.net/u011425751/article/details/51219242

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章