最近做項目中,使用了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