阿里的 FastJson 一直都很好用,在进行对象转换映射上处理起来非常简单。但今天我才发现我一直都是在瞎用。
之前解析Map的方式是这样的:
Map map = JSON.parseObject("{'name':'zhangsan','address':'hangzhou'}", Map.class);
这样得到的 Map 是没有泛型信息的,FastJson 在无法判断的情况下默认处理为了 Map<String,Object>
的格式,我们在实际使用时还需要再做一下转换。
这时我们可以通过类型参数的方式将泛型信息传入进去,这样FastJ
就能根据我们提供的泛型类型进行转换了。
String str = "{'name':'zhangsan','address':'hangzhou'}";
# 注意这里新建了一个内部类,区别在于最后有一对大括号
Map map = JSON.parseObject(str, new TypeReference<Map<String,String>>(){});
知道这个技巧后,就能够偷很多懒了,比如这样处理:
String str = "{'name': [1,2,3,4,5]}";
Map<String, List<Integer>> map = JSON.parseObject(str, new TypeReference<Map<String, List<Integer>>>() {});
或者由输入参数指定类型:
public static <T> void main(Class<T> clz) {
String str = "{'name': [1,2,3,4,5]}";
T instance = JSON.parseObject(str, new TypeReference<T>() {});
}
官方给出的示例是这样的:
String json = "[{},...]";
Type listType = new TypeReference<List<Model>>(){}.getType();
List<Model> modelList = JSON.parseObject(json, listType);
当然,这些只是一些皮毛,如何应用还看你怎么设计了。