【Java】解決Gson解析資料時int自動轉化為double問題
阿新 • • 發佈:2018-11-05
Gson可以將json字串轉換時, 原json字串中的int , long型的數字會預設被轉換成double型別 , 導致數字會多一個小數點 , 如 1 會轉成 1.0。
解決方法:
只需將Gson gson = new Gson();換成下面這個
Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<Map<String, Object>>(){
}.getType(), new GsonTypeAdapter()).create();
在工具類加上GsonTypeAdapter即可
GsonTypeAdapter:
public class GsonTypeAdapter extends TypeAdapter<Object>{ @Override public Object read(JsonReader in) throws IOException { // 反序列化 JsonToken token = in.peek(); switch (token) { case BEGIN_ARRAY: List<Object> list = new ArrayList<Object>(); in.beginArray(); while (in.hasNext()) { list.add(read(in)); } in.endArray(); return list; case BEGIN_OBJECT: Map<String, Object> map = new HashMap<String, Object>(); in.beginObject(); while (in.hasNext()) { map.put(in.nextName(), read(in)); } in.endObject(); return map; case STRING: return in.nextString(); case NUMBER: /** * 改寫數字的處理邏輯,將數字值分為整型與浮點型。 */ double dbNum = in.nextDouble(); // 數字超過long的最大值,返回浮點型別 if (dbNum > Long.MAX_VALUE) { return dbNum; } // 判斷數字是否為整數值 long lngNum = (long) dbNum; if (dbNum == lngNum) { return lngNum; } else { return dbNum; } case BOOLEAN: return in.nextBoolean(); case NULL: in.nextNull(); return null; default: throw new IllegalStateException(); } } @Override public void write(JsonWriter out, Object value) throws IOException{ // 序列化不處理 } }