简体   繁体   中英

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

I have calling a api using RestTemplate, let's suppose /getCompany

Usually response is as below:-

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

So I am parsing this as below:-

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()

But sometimes in the response I am also getting the below json string:

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

Now I am getting the below Exception:-

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

So Is there any way to handle Both situation ?

Update:-

As per comment added the below code:-

@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;
}

But still getting the same exception.

Thanks,

The registered objectMapper must be used with ACCEPT_SINGLE_VALUE_AS_ARRAY parameter.

Maybe the easiest way to achive this is to register a properly initialized ObjectMapper and MappingJacksonHttpMessageConverter in a class annotated with @Configuration :

@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;
}

Another way is to set the converter directly to the restTemplate object:

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 is a javascript object notation. JSON is the same syntax as the javascript. In JSON, array values must be of type string, array, number, object boolean or null.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM