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;
}
|
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"}
|
使用 writeValueAsString
和 writeValueAsBytes
可以将 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);
|