Jackson 简介
Jackson
是由 Faster
开发的一个 Java
工具库,常用于处理各种序列化反序列化操作。
Jackson — a fast and compliant streaming JSON parser/writer with a StAX-like API and support for marshalling/unmarshalling POJOs via annotations.
讲人话就是把 (Json
字符串/ xml
字符串/ 等) 转化为 Java
对象或者把 Java
对象转化为 (Json 字符串
/ xml 字符串
/ ……
) 串的工具,想了解更多可见:Jackson GitHub 仓库
Jackson 的使用
处理 Json 字符串
处理 Json
这块儿,与之类似的工具还有阿里的 FastJson
、谷歌的 Gson
……
FastJson Wiki 传送门 里面特意提到说比 XXX 快 6 倍,FastJson
对待友商的态度导致博主并不太想用 FastJson
。
然后根据知乎大佬的回答 知乎相关问题 传送门 ,最终决定还是用 Jackson
好了,另外 Spring Boot
内置的 Json
序列化反序列化工具也是 Jackson
。
Maven 依赖配置
pom.xml
文件示例
具体版本你们就自行查找吧,博主这里的是 2017.6 月更新的版本
<!--Jackson 核心库-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.9</version>
</dependency>
<!--Jackson 序列化库-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.9</version>
</dependency>
<!--Jackson 注解支持-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.9</version>
</dependency>
另:由于 spring-boot-starter-web
框架内部采用的 Jacson
作为 Json
解析工具,故在有 spring-boot-starter-web
环境的情况下,就不需要额外引入 上方 pom.xml
内容了
获取 ObjectMapper
// 静态类 Json 工具,调整序列化配置项会导致全局受影响,而你有时候可能只是想调整局部
// 所以这种非静态类获取工具实例的方案已经开始体现设计上的优越性了
ObjectMapper mapper = new ObjectMapper();
序列化
// 一个属性包含了对应 get/set 方法的普通 java 对象
Object Target = new User();
// 将Target对象转化为 json 串
String Result = mapper.writeValueAsString(Target)
反序列化
//Map套List的Json串
String src = "{"list1":[{"key1":"var1","key2":"var2"},{"key3":"var3","key4":"var4"}],"list2":[{"key5":"var5","key6":"var6"},{"key7":"var7","key8":"var8"}]}";
//Map套Map的Json串
String src2 = "{\"map1\":{\"key1\":\"val1\",\"key2\":\"val2\"},\"map2\":{\"key3\":\"val3\",\"key4\":\"val4\"}}";
Map<String,Object> map = mapper.readValue(src,Map.class);
for(Map.Entry<String, Object> entry : map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
System.out.println(entry.getValue().getClass());
}
System.out.println("------------------------------------------------------------");
Map<String,Object> map2 = mapper.readValue(src2,Map.class);
for(Map.Entry<String, Object> entry : map2.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
System.out.println(entry.getValue().getClass());
}
受 Java 泛型擦除影响,运行时无法感知类型,所以带泛型的类型,得事先把类型信息通过 TypeReference 保存起来
例如带泛型的数组、List 类型
// Json 转化为数组
String[] cpList = mapper.readValue("[\"a\",\"b\"]", new TypeReference<String[]>() {
});
// Json 转化为 List
ArrayList<String> cpList = mapper.readValue("[\"a\",\"b\"]", new TypeReference<ArrayList<String>>() {
});