1. 程式人生 > >【Java】解決Gson解析資料時int自動轉化為double問題

【Java】解決Gson解析資料時int自動轉化為double問題

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{
        // 序列化不處理
    }
}