fastJson序列化反序列化丢失对象类型

2,590 阅读1分钟

现象

        Map<Long, Set<Long>> channelIdTagIdsMap = new HashMap<>();

        channelIdTagIdsMap.put(1000266L, ImmutableSet.of(5102L));

        byte[] bytes = JSON.toJSONBytes(channelIdTagIdsMap);

        Map<String, List> channelIdTagIdsMap1 = JSON.parseObject(bytes, Map.class); 

序列化之前的map的key 是Long, value 是set, 凡序列化之后我们会认为channelIdTagIdsMap1和凡序列化之前的是一样的。 实际上

可以看到debug的结果反序列化之后的key是intger,value变成了jsonArray, 这会导致我们用Long型的key去channelIdTagIdsMap1中获取value为null,

原因

fastJson会根据number的长短来确定它的类型1000266L会默认反序列成integer

解决

  • 1 都指定成string,序列化方和反序列化方约定好,将反序列化得到的数据转化成期望的类型
        Map<String, Set<String>> channelIdTagIdsMap = new HashMap<>();

        channelIdTagIdsMap.put("1000266", ImmutableSet.of("5102"));

        byte[] bytes = JSON.toJSONBytes(channelIdTagIdsMap);

        Map<String, ? extends List> channelIdTagIdsMap1 = JSON.parseObject(bytes, Map.class);

        List list = channelIdTagIdsMap1.get(String.valueOf(1000266L));
  • 2 尽量不用map,使用具体的对象来做序列化反序列化
    @Data
    class Item {
        private Long channelId;

        private Collection<Long> tags;
    }