java - 在Java中,最好的方法是使JSON变得漂亮

  显示原文与译文双语对照的内容
115 1

我有像 below 格式( 不漂亮) 一样的对象列表。

{"data":[{"id":1,"firstName":"Bill","lastName":"Johnson"}]

我想要这样的( pretty ) 。

{
"data":[{
"id":1,"
 firstName":"Bill",
"lastName":"Johnson"
 }]
}

这是我的方法签名,以及对服务的调用以查询DB和打印json的返回。

public @ResponseBody ResponseEntity<ResponseData<List<NameSearchDTO>>> getInfo(@PathVariable String code, @PathVariable String idType)
ResponseData<List<NameSearchDTO>> response = new ResponseData<>();
List<NameSearchDTO> results = officeService.getByCode(code, idType); 
if (!results.isEmpty()) {
 response.setData(results);
 response.setStatus(Enum.SUCCESS.getDescription());
 response.setMessage(Enum.STATUS_SUCCESS.getDescription());
return new ResponseEntity<>(response, HttpStatus.OK);
}

ResponseData类实现可以序列化。当我不使用Jackson或者其他JSON库时,这是否使它成为"true"?

如何将响应传递给 below ObjectMapper以使它的非常漂亮?

ObjectMapper jacksonMapper = new ObjectMapper();
jacksonMapper.configure(SerializationFeature.INDENT_OUTPUT, true);

或者我需要创建一些JSONHelper类?

ResponseData类

public class ResponseData <E> implements Serializable{
private E data;
private String status;
private String message;
private boolean hasValidationError = false;
public E getData() {
 return data;
}
public void setData(E data) {
 this.data = data;
}
public String getStatus() {
 return status;
}
public void setStatus(String status) {
 this.status = status;
}
public String getMessage() {
 return message;
}
public void setMessage(String message) {
 this.message = message;
}
public boolean getHasValidationError(){
 return hasValidationError;
}
public void setHasValidationError(boolean hasValidationError){
 this.hasValidationError = hasValidationError;
}

}

时间:原作者:0个回答

66 3

你可以定义

  • MappingJacksonHttpMessageConverter ( 不需要 spring 引导)
  • 一个 Jackson2ObjectMapperBuilder Bean
  • @Primary 注释的简单 ObjectMapper Bean
  • 配置属性( Spring Boot - 为最简单的跳到这个 ) 。

对于第一个解决方案,你需要实现 WebMvcConfigurer 接口
( 如果你在 spring 引导上,请跳过这里选项)

@Configuration
class CustomWebMvcConfigurer implements WebMvcConfigurer {
 @Override
 public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {
 final ObjectMapper mapper =
 new Jackson2ObjectMapperBuilder()
. indentOutput(true)
. build();
//Or build ObjectMapper without the Spring builder, it's the same thing
 converters.add(new MappingJackson2HttpMessageConverter(mapper));
 }
}

关键是这条线

indentOutput(true)

它实际上操纵底层的ObjectMapper 配置

public Jackson2ObjectMapperBuilder indentOutput(boolean indentOutput) {
 this.features.put(SerializationFeature.INDENT_OUTPUT, indentOutput);
 return this;
}

第二个更简单一点

@Bean
Jackson2ObjectMapperBuilder jackson() {
 return new Jackson2ObjectMapperBuilder().indentOutput(true);
}

第三个更简单,只是

@Bean
@Primary
ObjectMapper objectMapper() {
 final ObjectMapper mapper = new ObjectMapper();
 mapper.enable(SerializationFeature.INDENT_OUTPUT); 
 return mapper;
}

第四种方法仅在使用配置属性时

spring.jackson.serialization.indent_output=true
原作者:
52 2

你标记了 gson,以便你可以使用此库来显示 .json file:

import org.json.JSONObject

val json ="{"data":[{"id":1,"firstName":"Bill","lastName":"Johnson"}]n"
val jsonObject = JSONObject(json)
println(jsonObject.toString(4))

https://github.com/google/gson

原作者:
91 5

我相信你正在寻找漂亮的gson打印功能。因为你已经用gson标注了你的问题,所以,如果你使用这个库,我。Mkyong在这里有一个出色的打印教程。

教程中的基本行是:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
原作者:
...