0


Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化

什么是 ObjectMapper

在 Java 中,可以使用各种 JSON 序列化和反序列化工具将 Java 对象转换为 JSON 字符串或者将 JSON 字符串转换为 Java 对象。其中,Jackson 库是比较常用的 JSON 序列化和反序列化工具之一,它提供了

ObjectMapper

类,用于将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象。

ObjectMapper

可以将 Java 对象转换为 JSON 字符串的方法有很多,比如

writeValueAsString

writeValue

等。其中,

writeValueAsString

方法会将 Java 对象转换为 JSON 字符串并返回,而

writeValue

方法则会将 Java 对象转换为 JSON 字符串并输出到指定的输出流中。同样,

ObjectMapper

也提供了很多方法用于将 JSON 字符串转换为 Java 对象,比如

readValue

readTree

等。

ObjectMapper 的使用

在Spring Boot 中,可以通过注入

ObjectMapper

对象来使用它提供的各种方法进行 JSON 序列化和反序列化。下面,演示如何使用

ObjectMapper

对象将一个 Java 对象序列化为 JSON 字符串,并将其返回给客户端。

@RestController@RequestMapping("/api")publicclassUserController{@AutowiredprivateObjectMapper objectMapper;@GetMapping("/user/{id}")publicResponseEntity<String>getUserById(@PathVariableLong id)throwsJsonProcessingException{// 根据id查询用户信息User user = userService.getUserById(id);// 将用户信息序列化为JSON字符串String jsonStr = objectMapper.writeValueAsString(user);// 将JSON字符串返回给客户端returnResponseEntity.ok(jsonStr);}}

在这个例子中,定义了一个

UserController

类,其中注入了一个

ObjectMapper

对象。在

getUserById

方法中,根据传入的

id

值查询了一个用户信息,并将该用户信息序列化为 JSON 字符串。最后,将序列化后的 JSON 字符串返回给客户端。

需要注意的是,在使用

ObjectMapper

进行序列化时,需要处理可能会抛出

JsonProcessingException

异常。这个异常通常是由于序列化过程中出现了错误,比如找不到序列化器、序列化器配置错误等。

在序列化过程中,如果需要对某些字段进行特殊处理,比如忽略某些字段、格式化日期字段等,可以通过创建一个

JsonSerializer

对象,并将其注册到

ObjectMapper

中来实现。具体的代码如下:

publicclassUserSerializerextendsJsonSerializer<User>{@Overridepublicvoidserialize(User user,JsonGenerator gen,SerializerProvider serializers)throwsIOException{
        gen.writeStartObject();
        gen.writeStringField("username", user.getUsername());
        gen.writeNumberField("age", user.getAge());
        gen.writeStringField("gender", user.getGender());
        gen.writeEndObject();}}@RestController@RequestMapping("/api")publicclassUserController{@AutowiredprivateObjectMapper objectMapper;@GetMapping("/user/{id}")publicResponseEntity<String>getUserById(@PathVariableLong id)throwsJsonProcessingException{// 根据id查询用户信息User user = userService.getUserById(id);// 注册自定义序列化器SimpleModulemodule=newSimpleModule();module.addSerializer(User.class,newUserSerializer());
        objectMapper.registerModule(module);//在这个例子中,创建了一个名为 `UserSerializer` 的自定义序列化器,继承了 `JsonSerializer<User>` 类,并实现了其 `serialize` 方法。在 `serialize` 方法中,重写了序列化逻辑,只序列化了 `username`、`age`、`gender` 三个字段,并将它们写入到 JSON 对象中。接着,在 `getUserById` 方法中,将自定义序列化器注册到 `ObjectMapper` 中,以便在序列化 `User` 对象时使用。

除了使用 `ObjectMapper` 对象进行序列化之外,还可以使用 `ObjectMapper` 对象进行反序列化。具体的代码如下:

```java
@RestController@RequestMapping("/api")publicclassUserController{@AutowiredprivateObjectMapper objectMapper;@PostMapping("/user")publicResponseEntity<User>createUser(@RequestBodyString jsonStr)throwsIOException{// 将JSON字符串反序列化为User对象User user = objectMapper.readValue(jsonStr,User.class);// 保存用户信息
        userService.saveUser(user);// 返回用户信息returnResponseEntity.ok(user);}}

在这个例子中,定义了一个

createUser

方法,用于创建一个新的用户。在该方法中,使用

@RequestBody

注解将客户端传来的 JSON 字符串转换为一个

User

对象,使用

objectMapper.readValue

方法实现反序列化。接着,将反序列化后的

User

对象保存到数据库中,并将该对象返回给客户端。

需要注意的是,在使用

ObjectMapper

进行反序列化时,需要处理可能会抛出

IOException

异常。这个异常通常是由于反序列化过程中出现了错误,比如无法解析 JSON 字符串、反序列化器配置错误等。

在反序列化过程中,如果需要对某些字段进行特殊处理,比如解析日期字段、忽略某些字段等,可以通过创建一个

JsonDeserializer

对象,并将其注册到

ObjectMapper

中来实现。

TypeReference 的使用

除了将 Java 对象序列化为 JSON 字符串之外,还可以将 JSON 字符串反序列化为一个 Map 对象。在使用

ObjectMapper

进行反序列化时,可以使用

readValue

方法将 JSON 字符串转换为一个通用的

JsonNode

对象,然后使用

JsonNode

对象的方法对其进行操作。但是,如果需要将 JSON 字符串转换为一个具体类型的 Map 对象,可以使用

TypeReference

类型来实现。

在使用

TypeReference

类型进行反序列化时,需要指定反序列化后的 Map 类型。具体的代码如下:

@RestController@RequestMapping("/api")publicclassUserController{@AutowiredprivateObjectMapper objectMapper;@GetMapping("/users")publicResponseEntity<List<User>>getUsers()throwsIOException{// 查询用户信息列表List<User> userList = userService.getUserList();// 将用户信息列表序列化为JSON字符串String jsonStr = objectMapper.writeValueAsString(userList);// 将JSON字符串反序列化为List<User>对象List<User> users = objectMapper.readValue(jsonStr,newTypeReference<List<User>>(){});// 返回用户信息列表returnResponseEntity.ok(users);}}

在这个例子中,定义了一个

getUsers

方法,用于获取用户列表。在该方法中,先查询了一个用户信息列表,并将该列表序列化为 JSON 字符串。接着,使用

objectMapper.readValue

方法将 JSON 字符串转换为一个

List<User>

对象,使用

new TypeReference<List<User>>()

来指定反序列化后的类型。最后,将反序列化后的

List<User>

对象返回给客户端。

需要注意的是,在使用

TypeReference

进行反序列化时,需要处理可能会抛出

IOException

异常。此外,如果反序列化的 JSON 字符串中包含了一些不属于预期类型的字段,可能会抛出

MismatchedInputException

异常。

总结

本文介绍了如何在 Spring Boot 中使用

ObjectMapper

进行 JSON 序列化和反序列化,包括将 Java 对象序列化为 JSON 字符串、将 JSON 字符串反序列化为 Java 对象和将 JSON 字符串反序列化为 Map 对象。同时,还介绍了如何使用自定义序列化器和反序列化器以及如何使用

TypeReference

进行反序列化。希望本文能够帮助

标签: spring boot json java

本文转载自: https://blog.csdn.net/m0_47406832/article/details/130971758
版权归原作者 小子宝丁 所有, 如有侵权,请联系我们删除。

“Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化”的评论:

还没有评论