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

什么是 ObjectMapper

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

ObjectMapper 可以将 Java 对象转换为 JSON 字符串的方法有很多,比如 writeValueAsStringwriteValue 等。其中,writeValueAsString 方法会将 Java 对象转换为 JSON 字符串并返回,而 writeValue 方法则会将 Java 对象转换为 JSON 字符串并输出到指定的输出流中。同样,ObjectMapper 也提供了很多方法用于将 JSON 字符串转换为 Java 对象,比如 readValuereadTree 等。

ObjectMapper 的使用

在Spring Boot 中,可以通过注入 ObjectMapper 对象来使用它提供的各种方法进行 JSON 序列化和反序列化。下面,演示如何使用 ObjectMapper 对象将一个 Java 对象序列化为 JSON 字符串,并将其返回给客户端。

@RestController
@RequestMapping("/api")
public class UserController {
    
    
    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/user/{id}")
    public ResponseEntity<String> getUserById(@PathVariable Long id) throws JsonProcessingException {
    
    
        // 根据id查询用户信息
        User user = userService.getUserById(id);

        // 将用户信息序列化为JSON字符串
        String jsonStr = objectMapper.writeValueAsString(user);

        // 将JSON字符串返回给客户端
        return ResponseEntity.ok(jsonStr);
    }
}

在这个例子中,定义了一个 UserController 类,其中注入了一个 ObjectMapper 对象。在 getUserById 方法中,根据传入的 id 值查询了一个用户信息,并将该用户信息序列化为 JSON 字符串。最后,将序列化后的 JSON 字符串返回给客户端。

需要注意的是,在使用 ObjectMapper 进行序列化时,需要处理可能会抛出 JsonProcessingException 异常。这个异常通常是由于序列化过程中出现了错误,比如找不到序列化器、序列化器配置错误等。

在序列化过程中,如果需要对某些字段进行特殊处理,比如忽略某些字段、格式化日期字段等,可以通过创建一个 JsonSerializer 对象,并将其注册到 ObjectMapper 中来实现。具体的代码如下:

public class UserSerializer extends JsonSerializer<User> {
    
    
    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    
    
        gen.writeStartObject();
        gen.writeStringField("username", user.getUsername());
        gen.writeNumberField("age", user.getAge());
        gen.writeStringField("gender", user.getGender());
        gen.writeEndObject();
    }
}

@RestController
@RequestMapping("/api")
public class UserController {
    
    
    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/user/{id}")
    public ResponseEntity<String> getUserById(@PathVariable Long id) throws JsonProcessingException {
    
    
        // 根据id查询用户信息
        User user = userService.getUserById(id);

        // 注册自定义序列化器
        SimpleModule module = new SimpleModule();
        module.addSerializer(User.class, new UserSerializer());
        objectMapper.registerModule(module);

        //在这个例子中,创建了一个名为 `UserSerializer` 的自定义序列化器,继承了 `JsonSerializer<User>` 类,并实现了其 `serialize` 方法。在 `serialize` 方法中,重写了序列化逻辑,只序列化了 `username`、`age`、`gender` 三个字段,并将它们写入到 JSON 对象中。接着,在 `getUserById` 方法中,将自定义序列化器注册到 `ObjectMapper` 中,以便在序列化 `User` 对象时使用。

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

```java
@RestController
@RequestMapping("/api")
public class UserController {
    
    
    @Autowired
    private ObjectMapper objectMapper;

    @PostMapping("/user")
    public ResponseEntity<User> createUser(@RequestBody String jsonStr) throws IOException {
    
    
        // 将JSON字符串反序列化为User对象
        User user = objectMapper.readValue(jsonStr, User.class);

        // 保存用户信息
        userService.saveUser(user);

        // 返回用户信息
        return ResponseEntity.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")
public class UserController {
    
    
    @Autowired
    private ObjectMapper objectMapper;

    @GetMapping("/users")
    public ResponseEntity<List<User>> getUsers() throws IOException {
    
    
        // 查询用户信息列表
        List<User> userList = userService.getUserList();

        // 将用户信息列表序列化为JSON字符串
        String jsonStr = objectMapper.writeValueAsString(userList);

        // 将JSON字符串反序列化为List<User>对象
        List<User> users = objectMapper.readValue(jsonStr, new TypeReference<List<User>>() {
    
    });

        // 返回用户信息列表
        return ResponseEntity.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 进行反序列化。希望本文能够帮助

猜你喜欢

转载自blog.csdn.net/m0_47406832/article/details/130971758