1. 程式人生 > >Gson處理json資料,轉換javaBean的時候,替換輸出欄位名,解析日期的坑

Gson處理json資料,轉換javaBean的時候,替換輸出欄位名,解析日期的坑

有的時候,我們輸出的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個名額,發貨領取獎品請掃碼聯絡店主這裡寫圖片描述