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

