解决Gson解析数据用map接收时int自动转化为double问题

来源:互联网 发布:mac怎么建文本文件 编辑:程序博客网 时间:2024/06/05 19:26

Gson可以将json字符串转换成map, 但是在转成map时, 原json字符串中的int , long型的数字会默认被转换成double类型 , 导致数字会多一个小数点 , 如 1 会转成 1.0。

我们可以用自定义TypeAdapter替代Gson默认的adapter解决:

        Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<Map<String, Object>>()        {        }.getType(), new GsonTypeAdapter()).create();        HLJHttpResponse response = gson.fromJson(result, HLJHttpResponse.class);

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    {        // 序列化不处理    }}
阅读全文
0 0
原创粉丝点击