.
有時候需要對 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 不能序列化的問題。
.