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

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
    {
        // 序列化不处理
    }
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值