簡體   English   中英

如何在REST響應中解析jsonObject和JsonArray為同一字段

[英]How to parse jsonObject and JsonArray for the same field in REST Response

我使用RestTemplate調用了一個api,讓我們假設/ getCompany

通常的回應如下:

"Organization":{
  "name": "My Company",
  "department": {
     "id": "1",
     "employee": [{
       "id": "84",
       "name": "abc"
      },
      {
       "id": "85",
       "name": "xyz"
      }]
 }
}

所以我解析如下:

ResponseEntity<Organization> company= new RestTemplate().exchange(new URI(companyUrl),HttpMethod.GET,request, Organization.class);
Organization comp= company.getBody();
Department dept= comp.getDepartment();
Employee[] emp = dept.getEmployees()

但有時在響應中,我還會得到以下json字符串:

"Organization":{
  "name": "My Company",
  "department": {
     "id": "1",
     "employee": {
       "id": "84",
       "name": "abc"
      }     
   }
}

現在我得到以下異常:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of Employee[] out of START_OBJECT token

那么有什么辦法可以處理這兩種情況?

更新:-

根據評論添加以下代碼:

@Bean
public ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
    return objectMapper;
}

@Bean
public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter(ObjectMapper objectMapper) {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(objectMapper);
    return converter;
}

但是仍然得到同樣的例外。

謝謝,

注冊的objectMapper必須與ACCEPT_SINGLE_VALUE_AS_ARRAY參數一起使用。

達到此目的的最簡單方法可能是在帶有@Configuration注釋的類中注冊正確初始化的ObjectMapperMappingJacksonHttpMessageConverter

@Bean
public ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(ACCEPT_SINGLE_VALUE_AS_ARRAY);
    return objectMapper;
}

@Bean
public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter(ObjectMapper objectMapper) {
    MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
    converter.setObjectMapper(objectMapper);
    return converter;
}

另一種方法是將轉換器直接設置為restTemplate對象:

public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(ACCEPT_SINGLE_VALUE_AS_ARRAY);
    return objectMapper;
}


public MappingJackson2HttpMessageConverter httpConverter(ObjectMapper objectMapper) {
    return new MappingJackson2HttpMessageConverter(objectMapper);
}

public void restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(Arrays.asList(httpConverter(objectMapper())));
    restTemplate.exchange(...);
}

JSON是一種JavaScript對象表示法。 JSON與javascript的語法相同。 在JSON中,數組值的類型必須為字符串,數組,數字,對象布爾值或null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM