0%

Jackson ObjectMapper 示例

Jackson 是 Java 知名流行的 JSON 库(不仅仅是JSON,还可以处理 XML),也是 Spring Boot 中默认集成的库。

1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>

jackson-databind 会默认引入 jackson-annotations(注解) 与 jackson-core (核心) 两个库。

使用 ObjectMapper

ObjectMapper 基本的读写操作:

  • writeValue 将 Java 对象序列化为 Json 字符串
  • readValue 解析 Json 字符串为 Java 对象
1
2
3
4
5
6
7
public class Car {

private String color;
private String type;

// standard getters setters
}

Java 对象序列化为 Json 字符串

1
2
3
4
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car("yellow", "renault");

objectMapper.writeValue(new File("target/car.json"), car);

输出到文件:

1
{"color":"yellow","type":"renault"}

使用 writeValueAsStringwriteValueAsBytes 可以将 Java 对象序列化为字符串或字节数组

1
String carAsString = objectMapper.writeValueAsString(car);

Json 字符串解析为 Java 对象

1
2
3
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";

Car car = objectMapper.readValue(json, Car.class);

readValue 方法还可以接受其他形式的输入,如一个包含 Json 的文件,或者是一个 URL 地址:

1
Car car = objectMapper.readValue(new File("src/test/resources/json_car.json"), Car.class);

Json 字符串解析为预定义 JsonNode 对象

1
2
3
4
String json = "{ \"color\" : \"Black\", \"type\" : \"FIAT\" }";

JsonNode jsonNode = objectMapper.readTree(json);
String color = jsonNode.get("color").asText();

Json 字符串解析为 Java List

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

Json 字符串解析为 Java Map

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

ObjectMapper 序列化、反序列化配置

默认情况下,当 JSON 字符串包含未知字段时,反序列化会抛出 UnrecognizedPropertyException 异常。如下多了一个 year 字段:

1
String jsonString = "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";

可以通过 .configure() 方法, 配置忽略为定义属性:

1
2
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Car car = objectMapper.readValue(jsonString, Car.class);