dongxishaonian

在上月末的时候收到一条关于fastjson安全漏洞的消息,突然想到先前好像已经有好多次这样的事件了(在fastjson上面)。关于安全方面,虽然中枪的机率微小,但是在这个信息越来越复杂的时代,安全性也变得越来越重要,就像DevSecOps的诞生,在软件交付的整个价值流中我们也需要注重安全这方面。当然我们现在不谈关于FastJson的优劣,因为我们本文的目标是让大家了解和掌握Jackson。


概览

Jackson是一个非常流行和高效的基于Java的库,它可以序列化java对象或将java对象映射到JSON,反之亦然。当然除了Jackson,在Java中同类型的优秀的库也有很多,比如:

关于哪一个最好或者哪一个最流行,没有明确的答案。技术的种类繁多,每个人对与不同技术的态度也不一样。言归正传,文章主要还是讨论Jackson的。本文主要讲解我们处理Json中最常见的两个操作:

  • 将Java对象序列化为JSON
  • JSON字符串反序列化为Java对象

引入依赖

由于在Spring/SpringBoot中很多组件已经自带了Jackson库,所以很多情况下不需要手动引入Jackson的依赖。

手动引入依赖:

<dependency> 
  <groupId>com.fasterxml.jackson.core</groupId> 
  <artifactId>jackson-databind</artifactId> 
  <version>2.9.8</version>
</dependency>

这个依赖关系还将传递地向类路径添加以下库:

  1. jackson-annotations-2.9.8.jar
  2. jackson-core-2.9.8.jar
  3. jackson-databind-2.9.8.jar

JavaObject to Json

ObjectMapper

ObjectMapper是一个映射器(或数据绑定器或编解码器),提供了在Java对象(bean的实例)和JSON之间进行转换的功能。

首先定义一个简单的Java类

public class Car {
    private String color;
    private String type;
    // standard getters setters
}

将Java对象转换成Json

我们使用ObjectMapper的writeValue相关Api来对Java对象进行序列化操作

ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car("blue","c1");
System.out.println(objectMapper.writeValueAsString(car));

此时输出

{"color":"blue","type":"c1"}

更多

ObjectMapper的writeValue相关Api还提供了很多便利的Json序列化操作方法,比如:将对象序列化成Json字节数组的writeValueAsBytes()方法、自定义输出源的writeValue()方法...

ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car("blue","c1");
objectMapper.writeValue(new File("./xxx.txt"),car);

运行上述代码,Java对象的序列化Json将被输出到xxx.txt文件。

image-20200605232424859


Json to JavaObject

将Json String转换成Java Object

ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"color\":\"blue\",\"type\":\"c1\"}";
Car car = objectMapper.readValue(json, Car.class);

readValue()方法也接受其他形式的输入,比如包含JSON字符串的文件:

ObjectMapper objectMapper = new ObjectMapper();
Car car = objectMapper.readValue(new File("./xxx.txt"), Car.class);
System.out.println(car);

JSON to Jackson JsonNode

JsonNode

一个JSON可以被解析成一个JsonNode对象,用来从一个特定的节点检索数据.

使用readTree()方法,我们可以将Json字符串转换成JsonNode

ObjectMapper objectMapper = new ObjectMapper();
String json = "{ \"color\" : \"Black\", \"type\" : \"FIAT\" }";
JsonNode jsonNode = objectMapper.readTree(json);
System.out.println(jsonNode.findValue("type").asText());
// 打印出“FAIT”

JSONArrayString to JavaList

ObjectMapper objectMapper = new ObjectMapper();
String jsonCarArray =
    "[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : 3. \"Red\", \"type\" : \"FIAT\" }]";
List<Car> listCar = objectMapper.readValue(jsonCarArray, new TypeReference<List<Car>>() {});

JSONString to JavaMap

ObjectMapper objectMapper = new ObjectMapper();
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {
});

分类:

技术点:

相关文章: