# GSON 轉換成 bean 時,支援 Timestamp 型別 ## 資料型別的需要 與 API 互動時,常需要將 feedback 轉為本地程式可利用的資料變數 這時會利用 [jsonschema2pojo ](http://www.jsonschema2pojo.org/) 等工具,透過填寫範例 JSON feedback 來 gen 出 vo/bean 該設定的 class 樣貌 其中,時間數值往往會被轉為 String,雖然可以透過後天再轉成所需的 Date 或 Timestamp 物件,但也有機會直接 gen 為 Timestamp 數值 ## GSON 處理 JSON 的一般流程 GSON 本身支援轉換成 class 的方法如 public <T> T fromJson(String json, Class<T> classOfT),為了增添設定,通常會自己寫一個 JsonUtility 並在裡面的方法 new GsonBuilder() ### 作法一:為 GsonBuilder() 註冊解特殊型別(例如 BigDecimal )的方法 註冊完才返回呼叫 fromJson,例如: ``` public static <T> List<T> fromJsonToList(String json, Class<?> classOfT) { GsonBuilder builder = new GsonBuilder(); // 對需要的特殊型別註冊如下: builder.registerTypeAdapter(BigDecimal.class, new BigDecimalDeserializer()); builder.registerTypeAdapter(Date.class, new DateTimeDeserializer()); Gson gsonObj = builder.create(); return gsonObj.fromJson(json, new ParameterTypeWrapper<>(classOfT)); } ``` 註冊時呼叫了 GSON 的 registerTypeAdapter() 方法 其中,呼叫時需要帶入自己寫的 Deserializer(): ``` private static class TimestampDeserializer implements JsonDeserializer<Timestamp> { @Override public Timestamp deserialize(JsonElement json, Type type, JsonDeserializationContext context) { try { // 另一種寫法是:return new Timestamp(json.getAsLong()); return new Timestamp(json.getAsJsonPrimitive().getAsLong()); } catch (Exception ignore) { return null; } } } ``` 說是這樣說,不過我沒試成功,也許是原始時間字串格式無法被判讀,也沒有時間繼續試 [How to deserialize class containing arraylist with timestamp data](https://stackoverflow.com/questions/30211699/how-to-deserialize-class-containing-arraylist-with-timestamp-data) ### 作法二:不用序列化,直接幫 GsonBuilder() setDateFormat Timestamp timestamp = new Timestamp(System.currentTimeMillis()); String json = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss.S").create().toJson(timestamp); 但我怎麼看這都比較像服務單一資料或把全部資料視為單一對象來操作,似乎無法滿足灌到 vo/bean 的需要 [com.google.gson.JsonSyntaxException when trying to parse Date/Time in json](https://stackoverflow.com/questions/22841306/com-google-gson-jsonsyntaxexception-when-trying-to-parse-date-time-in-json/34187419#34187419) ###### tags: `JSON` `Java`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up