Gson處理json資料,轉換javaBean的時候,替換輸出欄位名,解析日期的坑
阿新 • • 發佈:2019-02-04
有的時候,我們輸出的json資料可能跟原始javabean不一樣。為了說明這個問題,舉例如下:
package com.zhdw.mgrclient.test;
import java.util.Date;
public class Person {
private String name;
private int age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
javabean物件,比較簡單,以下是測試類:
package com.zhdw.mgrclient.test;
import java.util.Date;
import com.google.gson.Gson;
public class JSONTest {
public static void main(String[] args) {
Person hbk = new Person();
hbk.setAge(30);
hbk.setName("黃寶康");
hbk.setBirthday(new Date());
Gson gson = new Gson();
String result = gson.toJson(hbk);
System.out.println(result);
}
}
執行輸出
{"name":"黃寶康","age":30,"birthday":"May 21, 2018 11:50:23 AM"}
需求,我需要輸出NAME,而不是小寫的name,第二,日期格式不是我想要的。
Gson針對這兩個問題,提供了相關注解,只需要在Person的name欄位加入相關注解即可。
@SerializedName("NAME")
private String name;
再次執行輸出如下:可以看出name已經輸出成NAME了,第一個問題解決。
{"NAME":"黃寶康","age":30,"birthday":"May 21, 2018 11:53:25 AM"}
針對第二個問題,查看了相關部落格,在不同環境中由於返回的Local字串不同,在不同環境日期格式輸出會不一樣。
Gson預設處理Date物件的序列化/反序列化是通過一個SimpleDateFormat物件來實現的,通過下面的程式碼去獲取例項:
DateFormat.getDateTimeInstance()
在不同的locale環境中,這樣獲取到的SimpleDateFormat的模式字串會不一樣。
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
使用GsonBuilder()構建Gson物件,而不是之前的new Gson();
這樣執行輸出了我們想要的格式。
{"NAME":"黃寶康","age":30,"birthday":"2018-05-21 11:57:16"}
其他設定:
如列印美化的json格式資料等
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
通過上面的設定,控制檯輸出的json格式是帶有縮排的。
上面為了解決大小寫需求是通過註解的方式解決的,其實Gson還可以通過如下方式解決。(先去掉註解@SerializedName(“NAME”))
public static void main(String[] args) {
Person hbk = new Person();
hbk.setAge(30);
hbk.setName("黃寶康");
hbk.setBirthday(new Date());
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
// 設定欄位名稱策略
builder.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field field) {
// 業務規則可以自定義,實際專案可能會比較複雜
if(field.getName().equals("name")){
return "NAME";
}
return field.getName();
}
});
Gson gson = builder.setDateFormat("yyyy-MM-dd HH:mm:ss").create();
String result = gson.toJson(hbk);
System.out.println(result);
}
預設Gson輸出json,會把javabean的所有欄位都輸出,有的時候,業務上需要隱藏敏感欄位。
適應,給Person增加ignore屬性,同時生成getter和setter方法。
private String ignore;
public String getIgnore() {
return ignore;
}
public void setIgnore(String ignore) {
this.ignore = ignore;
}
測試類:
public static void main(String[] args) {
Person hbk = new Person();
hbk.setAge(30);
hbk.setName("黃寶康");
hbk.setBirthday(new Date());
hbk.setIgnore("不要看見我");
Gson gson = new Gson();
System.out.println(gson.toJson(hbk));
}
控制檯會輸出ignore欄位
{"name":"黃寶康","age":30,"birthday":"May 23, 2018 4:08:04 PM","ignore":"不要看見我"}
為了不看見ignore欄位,我們只需要在ignore屬性前加上transient修飾符即可。
private transient String ignore;
再次執行測試類,輸出
{"name":"黃寶康","age":30,"birthday":"May 23, 2018 4:12:41 PM"}
推廣
新款廚房臥室櫥櫃貼紙,大量有貨,支援分銷代銷,分享此內容到朋友圈,憑截圖找賣家免費領取保溫杯一個(包郵),活動真實有效,每天只有前60個名額,發貨領取獎品請掃碼聯絡店主