Spring Boot接口请求响应JSON格式不对称问题求助
问题:请求响应JSON格式不对称问题
发送Post/Put请求时,仅当使用扁平JSON(去掉大括号,只传属性值、不带属性名)时服务器才接收,而返回的却是嵌套JSON;若发送返回格式的嵌套JSON则会触发Bad Request,导致请求响应格式不对称。
接口请求/返回示例
1. MyTimeStamp接口
- 可正常接收的请求格式(扁平JSON):
"2023-02-19T16:08:41.897+00:00"
- 服务器返回格式(嵌套JSON):
{ "timestamp": "2023-02-19T16:08:41.897+00:00" }
2. MyTimeWrapper接口
- 可正常接收的请求格式:
{ "myTimeStamp":"2023-02-19T16:08:41.897+00:00" }
- 服务器返回格式:
{ "myTimeStamp": { "timestamp": "2023-02-19T16:08:41.897+00:00" } }
服务器端代码
MyTimeStamp类
package brokenjson.demo.demo; import lombok.*; @AllArgsConstructor @ToString @Getter @Setter public class MyTimeStamp { private String timestamp; }
MyTimeWrapper类
package brokenjson.demo.demo; import lombok.*; import java.beans.ConstructorProperties; @ToString @Getter @Setter public class MyTimeWrapper { private MyTimeStamp myTimeStamp; public MyTimeWrapper() { } }
控制器代码
package brokenjson.demo.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @PutMapping("/time") public MyTimeStamp gettingTimeStamp(@RequestBody MyTimeStamp myTimeStamp) { System.out.println(myTimeStamp); return myTimeStamp; } @PutMapping("/timeWrap") public MyTimeWrapper gettingTimeStamp(@RequestBody MyTimeWrapper myTimeWrapper) { System.out.println(myTimeWrapper); return myTimeWrapper; } }
环境说明
- Java版本:17
- Spring Boot版本:3.0.2
- 原以为是WebFlux序列化问题,但Spring MVC项目也存在该问题
- 注:MyTimeWrapper类需添加无参构造才能接收请求,暂未发现与当前问题的关联
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>brokenjson.demo</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
内容的提问来源于stack exchange,提问作者Yoav Zinger
相关产品推荐
相关产品推荐

