如何在 Spring Boot REST API 中格式化返回的 json?

Posted

技术标签:

【中文标题】如何在 Spring Boot REST API 中格式化返回的 json?【英文标题】:How to format returned json in Spring Boot REST API? 【发布时间】:2021-05-16 11:31:25 【问题描述】:

我使用 Spring Boot 创建了以下 REST API。

@RestController
public class PersonController 
    
    @Autowired
    private PersonRepository PersonRepository;
    
    @PostMapping(value="/Person", produces = "application/json")
    public ResponseEntity<Person> addPerson(@RequestBody Person Person)
        
        Person newPerson = PersonRepository.save(Person);       
        
        return new ResponseEntity<Person>(newPerson, HttpStatus.OK) ;
    


在 Postman 中我选择:

POST > http://localhost:8080/person > json

然后在正文字段中,我放置以下 json 并点击发送:

"id":"", "name":"john", "age":"40", "email":"test@test.com"

这是我得到的回报:


    "name": "john",
    "age": 40,
    "email": "test@test.com",
    "_links": 
        "self": 
            "href": "http://localhost:8080/person/10"
        ,
        "person": 
            "href": "http://localhost:8080/person/10"
        
    

但是,我希望 json 以这种其他格式返回:


    "id": 10,
    "name": "john",
    "age": 40,
    "email": "test@test.com"

怎么做?

【问题讨论】:

【参考方案1】:

看起来您也在使用 SpringDataRest,它根据您的实体公开 _links 等。我猜 SpringDataRest 的控制器是在您的请求中调用的,而不是您的自定义端点。尝试在您的控制器方法中记录一些内容以确保它被实际调用。 如果您的服务的另一部分不需要 SpringDataRest,则应删除依赖项。

【讨论】:

【参考方案2】:

我刚刚发现了问题。

在控制器中的代码是:

@PostMapping(value="/person"....

当我在邮递员的时候:

http://localhost:8080/persons

(以字母s结尾)

因此它从未进入控制器方法。

当我从邮递员调用中删除 s 时,它可以正常工作并以我想要的方式返回 json。

现在...

有趣的是,当使用字母s调用时,它确实保存到db并返回json,即使映射不正确。

所以我决定在调试模式下运行(使用不正确的映射)并注意到它没有进入方法。

这很奇怪。如何正确保存并返回 json?

然后我决定注释掉所有方法并再次在邮递员上运行调用。

它再次将 json 保存到数据库并以第一种格式返回 json。

所以这似乎是在幕后以某种方式完成的,肯定不是通过我创建的方法。

【讨论】:

以上是关于如何在 Spring Boot REST API 中格式化返回的 json?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JWT - 如何实现刷新令牌和注销 REST-API

如何在 Spring Boot REST API 中格式化返回的 json?

在 Spring-boot 中成功登录后如何限制 POST Rest Api 以供公共访问

如何在 Spring Boot Rest api 响应的 ResponseEntity 中添加自定义属性

如何在 Spring Boot Rest API 中以 XML 形式返回对象列表

如何在 Spring Boot Rest api 中创建安全登录控制器