详解SpringBoot定制@ResponseBody注解返回的Json格式

接下来我将详细讲解“详解SpringBoot定制@ResponseBody注解返回的Json格式”的完整攻略。本攻略主要包括以下内容:

接下来我将详细讲解“详解SpringBoot定制@ResponseBody注解返回的Json格式”的完整攻略。本攻略主要包括以下内容:

  1. 什么是@ResponseBody注解
  2. @ResponseBody注解返回的默认Json格式
  3. 定制@ResponseBody注解返回的Json格式

1. 什么是@ResponseBody注解

@ResponseBody注解是Spring框架提供的一种注解,它用于指定Controller类中方法的返回值类型。使用@ResponseBody注解,可以将控制器方法返回的数据直接以Json或XML格式写入Response输出流中。

2. @ResponseBody注解返回的默认Json格式

当使用@ResponseBody注解返回数据时,如果方法返回的是一个对象,则Spring框架默认使用Jackson库将这个对象转化为Json格式的字符串。例如,下面是一个使用@ResponseBody注解返回一个对象的示例:

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        return user;
    }
}

在上述代码中,getUserById方法使用@GetMapping注解将HTTP GET请求映射到/user/{id}路径。方法返回一个User对象,并使用@ResponseBody注解将其转换为Json字符串返回。

当调用该方法时,如访问http://localhost:8080/user/1,将返回如下Json格式的数据:

{
    "id": 1,
    "username": "user001",
    "email": "user001@springboot.com"
}

3. 定制@ResponseBody注解返回的Json格式

虽然Spring框架默认使用Jackson库将Java对象转换为Json格式的字符串,但是有时候我们需要对Json格式的输出进行一些定制,比如更改日期格式、更改属性名称等。这时我们可以使用Jackson库提供的注解或自定义Jackson的序列化器和反序列化器来实现。

下面是一个使用Jackson注解定制@ResponseBody返回的Json格式的示例:

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    @JsonSerialize(using = CustomDateSerializer.class)
    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
    public User getUserById(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        return user;
    }
}

在上述代码中,我们使用@JsonSerialize注解将CustomDateSerializer类指定为对日期类型属性进行序列化的类;使用@JsonNaming注解将属性名转换为蛇形命名方式。

public class CustomDateSerializer extends JsonSerializer<Date> {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(dateFormat.format(value));
    }
}

在上述代码中,我们定义了一个CustomDateSerializer类,用于将Date类型转化为按照指定格式的字符串。这样在进行序列化时就会按照我们指定的格式序列化。

另外,我们还可以使用自定义的序列化和反序列化器来对Java对象和Json字符串进行转换。下面是一个自定义序列化器和反序列化器的示例:

public class UserJsonSerializer extends JsonSerializer<User> {

    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeNumberField("id", user.getId());
        gen.writeStringField("nickname", user.getUsername());
        gen.writeEndObject();
    }
}

public class UserJsonDeserializer extends JsonDeserializer<User> {

    @Override
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);
        Long id = node.get("id").asLong();
        String nickname = node.get("nickname").asText();
        User user = new User();
        user.setId(id);
        user.setUsername(nickname);
        return user;
    }
}

在上述代码中,我们定义了一个UserJsonSerializer类,用于将User对象转化为指定的Json格式;定义了一个UserJsonDeserializer类,用于将Json格式的字符串转换为User对象。

然后在Controller中使用这些自定义的序列化器和反序列化器:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        return user;
    }

    @PostMapping("/user")
    public User addUser(@RequestBody User user) {
        // do something to save user
        return user;
    }

    @PutMapping("/user")
    public User updateUser(@RequestBody User user) {
        // do something to update user
        return user;
    }

    @DeleteMapping("/user/{id}")
    public String deleteUserById(@PathVariable("id") Long id) {
        // do something to delete user
        return "success";
    }
}

上述代码中,我们定义了一个UserController类,其中包括获取用户、添加用户、更新用户和删除用户的方法。在添加、更新和获取用户的方法中,使用了自定义的UserJsonSerializer和UserJsonDeserializer来转换Java对象和Json字符串。当访问http://localhost:8080/user/1时,将返回如下格式的json数据:

{
    "id": 1,
    "nickname": "user001"
}

至此,我们成功地完成了SpringBoot定制@ResponseBody注解返回的Json格式的攻略。

本文标题为:详解SpringBoot定制@ResponseBody注解返回的Json格式

基础教程推荐