现象
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和凡序列化之前的是一样的。 实际上
原因
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;
}