spring boot rest api,控制返回json数据,过滤部分字段

前言

spirng boot:2.4.5

fastjson:1.2.7

当我们使用spring boot作为web服务端,接口采用restful api时,需要控制前端请求api的json数据格式,同时也需要控制服务端响应的json数据内容,可能出现以下场景:

  1. json中某些属性,请求api和api响应中都需要忽略
  2. json中某些属性,请求api时忽略接收,api响应时需要携带
  3. json中某些属性,请求api时接收,api响应时忽略
  4. json中某些null值的属性,在api响应中忽略
  5. json中某些属性,api响应时属性名称进行修改
  6. 同一实体,在不同方法调用下属性忽略配置各不相同

日常工作中基本就是以上场景的应用。

解决方案

同一实体在不同的过滤方案基本就是在对象的序列号和反序列号上进行操作实现的,这里我们通过以下几个注解实现上述的几种场景:

@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响应如下:

 

Spring Boot 提供了多种方式来验证 RESTful API 返回JSON。 1. 手动验证 手动验证是最基本的验证方式。通过使用 Postman 或类似的工具发送请求,然后手动比较返回JSON 和预期的 JSON 是否一致。这种方法适用于简单的 API,但对于复杂的 API,手动验证将变得非常困难。 2. 单元测试 单元测试是验证 RESTful API 返回JSON 的最佳方式之一。通过使用 Spring Boot 的测试框架,可以编写测试用例来模拟 API 请求,并验证返回JSON 是否符合预期。这种方法可以自动化测试,并在代码变更时自动运行测试用例,确保 API 的正确性。 3. 集成测试 集成测试是测试整个系统的功能的最佳方式,包括 RESTful API。通过使用集成测试,可以验证 API 返回JSON 是否符合预期,并确保整个系统的正确性。集成测试可以使用自动化测试框架,例如 Selenium、Cucumber 或 Robot Framework。 4. Swagger UI Swagger UI 是一个流行的 API 文档和测试工具,可以使用它来验证 RESTful API 返回JSON。Swagger UI 可以在 API 文档中直接测试 API,并验证返回JSON 是否符合预期。此外,Swagger UI 还提供了自动生成 API 文档的功能,使得 API 的文档化变得非常容易。 5. JSON 校验工具 最后,可以使用 JSON 校验工具来验证 RESTful API 返回JSON。这些工具可以检查 JSON 是否符合规范,并提供有关 JSON 中错误的详细信息。一些流行的 JSON 校验工具包括 JSONLint、JSON Validator 和 JSON Formatter。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值