Gson 如何保留某些字段,不進行解析?

.

有時候需要對 Json 中的某些字段保持原樣,不進行解析。
那麼可以使用 JsonElement 類型,例如:

Json 數據

{
  "id": 837,
  "name": "input_text",
  "extras": {
    "language": "en-us",
    "enable": false,
    "text": "life is hard",
    "voice": "ivy",
    "format": "wav",
    "sr": 24000
  }
}

數據實體

public class Data {
    
    @SerializedName("id")
    public int id;
    
    @SerializedName("name")
    public String name;

    //附加字段,客戶端不需要關心,透傳給服務端接口
    @SerializedName("extras")
    public JsonElement extras;

}

但是,如果上面的 Data 實現了 Serializable 接口的話,則在進行序列化(反序列化)時,會拋出異常,原因是 JsonElement 不支持序列化。

 

下面給出一種解決方法

public class Data implements Serializable {
    
    @SerializedName("id")
    public int id;
    
    @SerializedName("name")
    public String name;

    /**
     * 附加字段,客戶端不需要關心,透傳給服務端接口
     *
     * 1. extra內容客戶端不關心,不進行解析,所以用JsonElement存放
     * 2. 由於JsonElement沒有實現Serializable,所以要加transient關鍵字
     * 3. 但是加了transient會導致Gson忽略該字段,使得extras=null
     * 4. 最後通過自定義Adapter的方法來解決,用String來存儲未解析的內容
     */
    @SerializedName("extras")
    @JsonAdapter(RawStringJsonAdapter.class)
    public String extras;

}

上面通過 @JsonAdapter 註解給 extras 綁定了一個 RawStringJsonAdapter,它的代碼如下:

//將部分json內容保留爲字符串形式,不進行解析
public static class RawStringJsonAdapter extends TypeAdapter<String> {

    @Override
    public void write(JsonWriter out, String value) throws IOException {
        out.jsonValue(value);
    }

    @Override
    public String read(JsonReader in) throws IOException {
        return new JsonParser().parse(in).toString();
    }
}

這樣一來,我們就可以把那些不想解析的 Json 內容存儲到 String 中,解決了 JsonElement 不能序列化的問題。

 

.

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