zoukankan      html  css  js  c++  java
  • Gson反序列化Map,整型自动转换为浮点型

    一 坑

    场景:将Map<String,Object>结果序列化后放入redis缓存,发现反序列化后Integer类型自动转换成了Double类型

    二 测试重现

     @Test
        public void testJsonDefault() {
            Map<String,Object> map=new HashMap<>();
            map.put("a","aa");
            map.put("b",11);
            String json=GsonUtil.toJson(map,false);
            map=GsonUtil.fromJsonDefault(json, new TypeToken<Map<String, Object>>() {
            });
            showMap(map);
        }

    运行结果:

    a-aa-String

    b-11.0-Double

    三 解决

     /**
         * json字符串转bean对象
         *
         * @param json
         * @param cls
         * @return
         */
        public static <T> T fromJson(String json, Class<T> cls) {
    
            Gson gson = new GsonBuilder().setDateFormat(DATEFORMAT_default)
                    .create();
    
            return gson.fromJson(json, cls);
    
        }
    
       
    public static class MapTypeAdapter 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 LinkedTreeMap<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 {
                // 序列化无需实现
            }
    
        }

    继续测试:

    @Test
        public void testfromJson() {
            Map<String,Object> map=new HashMap<>();
            map.put("a","aa");
            map.put("b",11);
            String json=GsonUtil.toJson(map,false);
            map = GsonUtil.fromJson(json,
                    new TypeToken<Map<String, Object>>() {
                    });
            showMap(map);
        }

    运行结果:

    a-aa-String

    b-11-Long

  • 相关阅读:
    ios-pch文件的手动添加
    iOS远程消息推送自我整理版
    iOS远程消息推送
    苹果App store 2015最新审核标准公布(2015.3)
    App上线基本流程
    iOS中常用的正则表达式
    如何获取App当前版本号
    添加Appicon的方法
    键盘弹出
    iOS9适配中出现的一些常见问题
  • 原文地址:https://www.cnblogs.com/janes/p/10000611.html
Copyright © 2011-2022 走看看