前言
spirng boot:2.4.5
fastjson:1.2.7
当我们使用spring boot作为web服务端,接口采用restful api时,需要控制前端请求api的json数据格式,同时也需要控制服务端响应的json数据内容,可能出现以下场景:
- json中某些属性,请求api和api响应中都需要忽略
- json中某些属性,请求api时忽略接收,api响应时需要携带
- json中某些属性,请求api时接收,api响应时忽略
- json中某些null值的属性,在api响应中忽略
- json中某些属性,api响应时属性名称进行修改
- 同一实体,在不同方法调用下属性忽略配置各不相同
日常工作中基本就是以上场景的应用。
解决方案
同一实体在不同的过滤方案基本就是在对象的序列号和反序列号上进行操作实现的,这里我们通过以下几个注解实现上述的几种场景:
@JsonInclude
@JsonProperty
@JsonIgnore
@JsonIgnoreProperties
@JsonProperty
@JsonView
场景一
json中某些属性,请求api和api响应中都需要忽略
忽略用户的编号和手机号
Tips:如果User实体进行参数接收的话,后端接收name字段,响应name字段
实现一
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
@JsonIgnore
protected String id;
/** 名称 */
protected String name;
/** 手机号码 */
@JsonIgnore
protected String phoneNumber;
}
实现二
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.io.Serializable;
@Data
@JsonIgnoreProperties(value = {"id", "phoneNumber"})
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
protected String id;
/** 名称 */
protected String name;
/** 手机号码 */
protected String phoneNumber;
}
场景二
json中某些属性,请求api时忽略接收,api响应时需要携带
Tips:如果User实体进行参数接收的话,后端接收name、phoneNumber字段,响应id、name、phoneNumber字段
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
protected String id;
/** 名称 */
protected String name;
/** 手机号码 */
protected String phoneNumber;
}
场景三
json中某些属性,请求api时接收,api响应时忽略
Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应name、phoneNumber字段
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
protected String id;
/** 名称 */
protected String name;
/** 手机号码 */
protected String phoneNumber;
}
场景四
json中某些null值的属性,在api响应中忽略
Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应时若id、name、phoneNumber字段为null值则忽略该字段
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.io.Serializable;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
protected String id;
/** 名称 */
protected String name;
/** 手机号码 */
protected String phoneNumber;
}
场景五
json中某些属性,api响应时属性名称进行修改
Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应id、name、phone字段,原本的phoneNumber被重命名为phone
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
protected String id;
/** 名称 */
protected String name;
/** 手机号码 */
@JsonProperty("phone")
protected String phoneNumber;
}
场景六
同一实体,在不同方法调用下属性忽略配置各不相同
Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应时如果方法配置相同@JsonView则为name、phoneNumber字段,如果在非@JsonView中响应id、name、phoneNumber字段
import com.fasterxml.jackson.annotation.JsonView;
import com.demo.apis.TestApi;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private static final long serialVersionUID = 5209364517621033304L;
/** 编号 */
protected String id;
/** 名称 */
@JsonView(TestApi.class)
protected String name;
/** 手机号码 */
@JsonView(TestApi.class)
protected String phoneNumber;
}
@RestController
@RequestMapping("/api")
public class TestApi {
/**
* 测试1
*/
@GetMapping("/test1")
@JsonView(TestApi.class)
public User test1(User user){
return user;
}
/**
* 测试2
*/
@GetMapping("/test2")
public User test2(User user){
return user;
}
}
请求参数如下:
/api/test1响应如下:
/api/test2响应如下: