【问题标题】:Beautify or return pretty JSON response for every REST API response为每个 REST API 响应美化或返回漂亮的 JSON 响应
【发布时间】:2021-08-26 01:45:21
【问题描述】:

我的 REST API 响应如下所示:

{"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"close": "17:00", "open": "08:00"}, "Wednesday": {"close": "17:00", "open": "08:00"}, "Thursday": {"close": "17:00", "open": "08:00"}}, "open": true, "categories": ["Doctors", "Health & Medical"], "city": "Phoenix", "review_count": 7, "name": "Eric Goldberg, MD", "neighborhoods": [], "longitude": -111.98375799999999, "state": "AZ", "stars": 3.5, "latitude": 33.499313000000001, "attributes": {"By Appointment Only": true}, "type": "business"}

是否有任何 HTTP 标头或类似的通用标头可以美化此 JSON 响应?

这是一个现有项目,所以我不能真正使用任何 3rd 方库在每个服务或控制器层中更改它。我需要一些适用于每个响应的东西。

预期响应:

{
  "business_id": "vcNAWiLM4dR7D2nwwJ7nCA",
  "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018",
  "hours": {
    "Tuesday": {
      "close": "17:00",
      "open": "08:00"
    },
    "Friday": {
      "close": "17:00",
      "open": "08:00"
    },
    "Monday": {
      "close": "17:00",
      "open": "08:00"
    },
    "Wednesday": {
      "close": "17:00",
      "open": "08:00"
    },
    "Thursday": {
      "close": "17:00",
      "open": "08:00"
    }
  },
  "open": true,
  "categories": [
    "Doctors",
    "Health & Medical"
  ],
  "city": "Phoenix",
  "review_count": 7,
  "name": "Eric Goldberg, MD",
  "neighborhoods": [],
  "longitude": -111.983758,
  "state": "AZ",
  "stars": 3.5,
  "latitude": 33.499313,
  "attributes": {
    "By Appointment Only": true
  },
  "type": "business"
}

我正在寻找类似“Content-type”标头之类的东西来决定响应的格式。

【问题讨论】:

    标签: json spring rest pretty-print


    【解决方案1】:

    Spring 使用ObjectMapper 类来序列化/反序列化 json 对象。您可以通过提供自定义配置来覆盖它:

    @Configuration
    public class ObjectMapperConfig {
        @Bean
        public ObjectMapper objectMapper() {
            return new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
        }
    }
    

    这样,您应用程序中的任何序列化 json(不仅是 http 响应)都会“漂亮”。

    但是,如果您只想美化 http 响应。您可以通过以下方式覆盖AbstractHttpMessageConverter 类:

    @Component
    public class PrettyJsonMessageConverter extends AbstractHttpMessageConverter<Object> {
    
        @Autowired
        private ObjectMapper objectMapper;
    
        public PrettyJsonMessageConverter() {
            super(MediaType.APPLICATION_JSON);
        }
    
        @Override
        protected boolean supports(Class<?> clazz) {
            return true;
        }
    
        @Override
        protected Object readInternal(Class<? extends Object> clazz,
                                      HttpInputMessage inputMessage) throws HttpMessageNotReadableException, IOException {
            return objectMapper.readValue(inputMessage.getBody(), clazz);
        }
    
        @Override
        protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
            outputMessage.getBody().write(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(o));
        }
    }
    

    【讨论】:

    • 同样,这适用于单个响应或端点。我正在寻找类似“Content-type”标头的东西来决定响应的格式。
    • @ASAkram 没有自动更改此设置的标头。
    • @ASAkram 一旦您配置了 objectMapper 或 AbstractHttpMessageConverter,它将适用于所有响应,您无需采取进一步行动。
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多