考虑简单的@RestController,返回一个Map:
@GetMapping("/foo")
public ResponseEntity<Map<String, Object>> foo() {
Map<String, Any> map = HashMap<>();
map.put(...);
return ResponseEntity(map, HttpStatus.OK);
}
这很好用,并且将Map作为JSON返回。
但是,当您在终端中curl
进行请求时,光标停留在JSON的末尾,很遗憾,使用它很不舒服。在每个JSON的末尾,我们之前的实现始终返回\n
。有没有办法使Spring附加\n
?
编辑
我尝试实现格式化程序:
private inner class MapFormatter : Formatter<Map<*, *>> {
override fun parse(payload: String, locale: Locale): Map<*, *> {
return Gson().fromJson(payload, Map::class)
}
override fun print(payload: Map<*, *>, locale: Locale): String {
return Gson().toJson(payload) + "\n"
}
}
并添加到:
override fun addFormatters(registry: FormatterRegistry) {
registry.addFormatter(MapFormatter())
}
不幸的是它从未被调用过,我想格式化程序是用于其他用途的。
答案 0 :(得分:2)
最后通过HttpMessageConverter
完成:
class GsonHttpMessageConverter : AbstractHttpMessageConverter<Map<String, Any?>>(
MediaType("application", "json", Charset.forName("UTF-8"))) {
override fun readInternal(clazz: Class<out Map<String, Any?>>, inputMessage: HttpInputMessage)
= Gson().fromJson(IOUtils.toString(inputMessage.body, "UTF-8"), clazz)
override fun supports(clazz: Class<*>) = Map::class.java.isAssignableFrom(clazz)
override fun writeInternal(payload: Map<String, Any?>, outputMessage: HttpOutputMessage) {
outputMessage.body.write(Gson().toJson(payload) + "\n".toByteArray())
}
}
答案 1 :(得分:0)
您可以使用Jackson序列化为字符串,然后附加所需的内容并使其成为响应实体的主体。
类似的东西:
//Somewhere in the class fields
private final ObjectMapper mapper = new ObjectMapper();
@GetMapping("/foo")
public ResponseEntity<Map<String, Object>> foo() {
Map<String, Any> map = HashMap<>();
map.put(...);
return ResponseEntity(mapper.writeValueAsString(map) + "/n", HttpStatus.OK);
}
然而,正确的答案将是使您使用的解析JSON的内容按照您的意愿显示出来。因为现在您将不得不添加所有这些复杂性。
另一种解决方案是通过设置漂亮的打印机https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/ObjectMapper.html#setDefaultPrettyPrinter(com.fasterxml.jackson.core.PrettyPrinter)来“漂亮地打印” JSON。
如果您要执行此操作,请在构建控制器/服务的地方使用如下所示的方法在春季级别进行设置:
//Need to look at the documentation and figure out how to set this.
@Bean
public Jackson2ObjectMapperBuilderCustomizer mapperBuilderCustomizer() {
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
}