Jackson 快速入门

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.

Faster 组织官方描述

讲人话就是把 (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>>() {
            });

参考资料

Jackson Annotations 注解详解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值