在 Spring Boot 2 中将包含带引号的字符串的请求正文解析为 JSON

And*_*dyB 11 java spring json spring-boot

我有一个应用程序公开一个接受PUTJSON 格式字符串请求的端点,例如:

PUT /my/endpoint
"some string"
Run Code Online (Sandbox Code Playgroud)

我的端点方法签名类似于:

PUT /my/endpoint
"some string"
Run Code Online (Sandbox Code Playgroud)

myString使用 Spring Boot 1 (1.5.22.RELEASE),上面示例的值PUT将是文字 text some string,但在 Spring Boot 2 (2.3.6.RELEASE) 下,它现在是文字文本"some string"- 即看起来输入严格来说不会被解析为 JSON,因为引号不会被删除。

我相信带引号的字符串是有效的 JSON(不带引号的字符串则不是),就像对象(在{和中})和列表(在[和 中])一样。

我已经删除了一些无关紧要的细节,我认为这些细节对于当前的问题并不重要(例如,我们用作CompletableFuture返回值,我也有一个@PathVariable在那里,并且正在进行一些注释驱动的验证) ,但我留下了我们正在使用自定义媒体类型的说法,以防与它有关。

我有什么想法可以说服 Spring Boot 2 将我的请求正文正确地视为 JSON?不幸的是,我无法重新定义 API,因为我们已经有实际客户在使用它。

pir*_*rho 6

这可能不是最好的选择,但如果一开始没有其他帮助的话。而不是String让 SpringRequestBody作为Object. 所以就像:

public ResponseEntity<String> myEndpoint(@RequestBody final Object myString)
Run Code Online (Sandbox Code Playgroud)

使用StringSpring 时,甚至可能不使用 Jackson 进行解析,而是将正文处理为String应该包含正文中的所有字符,即使内容类型设置为 JSON。

如果您执行以下操作:

String myString2 = new ObjectMapper().readValue(myString, String.class);
Run Code Online (Sandbox Code Playgroud)

您可以看到它导致myString2没有双引号周围的内容。

SpringObject似乎以不同的方式处理它。它使它成为 aString但似乎将其视为 JSON 值(并且作为一个String值,因为有周围的双引号),它不应该有周围的双引号。

如果你使用Object然后登录myString.getClass()你会发现它实际上是一个java.lang.String