我正在尝试调用外部RESTful Web服务,并且需要解析出嵌套JSON附带的响应。我正在尝试解析以下内容:


{“ list”:[{“ list_id”:“ abcdef”,“ list_name”:“ testing123”},{“ list_id”:“ xyz”,“ list_name”:“ testing456”}]}


我的POJO类如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
public class ListGetResponse {
    private String list = "";
    private SMSList lists;

    public String getList() {
        return list;
    }

    public void setList(String list) {
        this.list = list;
    }

    public SMSList getLists() {
        return lists;
    }

    public void setLists(SMSList lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "SMSListGetResponse [list=" + list + "]";
    }


    @JsonIgnoreProperties(ignoreUnknown = true)
    public class SMSList {
        private String list = "";
        private String list_id = "";
        private String list_name = "";


        public String getList() {
            return list;
        }
        public void setList(String list) {
            this.list = list;
        }
        public String getList_id() {
            return list_id;
        }
        public void setList_id(String list_id) {
            this.list_id = list_id;
        }
        public String getList_name() {
            return list_name;
        }
        public void setList_name(String list_name) {
            this.list_name = list_name;
        }
        @Override
        public String toString() {
            return "SMSList [list_id=" + list_id + ", list_name=" + list_name
                    + "]";
        }


    }


我通过此方法调用此函数。

public void get()
{
    RestTemplate restTemplate = SMSRestFactory.getRestTemplate();

    ResponseEntity<ListGetResponse> responseEntity = restTemplate.getForEntity(SMS_LIST_GET, ListGetResponse.class);
    ListGetResponse body = responseEntity.getBody();
    System.out.println(responseEntity.getBody());
    System.out.println(body);
}


调用get()时;我收到以下StackTrace

  Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@165ae07; line: 1, column: 2] (through reference chain: com.em.ustms.sms.list.model.ListGetResponse["list"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@165ae07; line: 1, column: 2] (through reference chain: com.em.ustms.sms.list.model.ListGetResponse["list"])
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:788)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:773)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:553)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:268)
    at com.em.ustms.sms.service.SMSListService.get(SMSListService.java:59)
    at com.em.ustms.sms.Application.main(Application.java:12)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@165ae07; line: 1, column: 2] (through reference chain: com.em.ustms.sms.list.model.ListGetResponse["list"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:691)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:46)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:525)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
    ... 9 more

最佳答案

得到它的工作。将我的SMSList对象更改为List 并将SMSList类更改为静态类

将SMSList更改为List 后,我收到以下堆栈跟踪:

   Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: No suitable constructor found for type [simple type, class com.em.ustms.sms.list.model.ListGetResponse$SMSList]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1d1ab77; line: 1, column: 11] (through reference chain: com.em.ustms.sms.list.model.ListGetResponse["list"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.em.ustms.sms.list.model.ListGetResponse$SMSList]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1d1ab77; line: 1, column: 11] (through reference chain: com.em.ustms.sms.list.model.ListGetResponse["list"])
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:788)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:773)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:553)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:268)
    at com.em.ustms.sms.service.SMSListService.get(SMSListService.java:59)
    at com.em.ustms.sms.Application.main(Application.java:12)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.em.ustms.sms.list.model.ListGetResponse$SMSList]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1d1ab77; line: 1, column: 11] (through reference chain: com.em.ustms.sms.list.model.ListGetResponse["list"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1078)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:268)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:227)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:204)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:525)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
    ... 9 more


通过将SMSClasss更改为静态类可以解决此问题:

import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class ListGetResponse {
private List<SMSList> list;

public List<SMSList> getList() {
    return list;
}

public void setList(List<SMSList> list) {
    this.list = list;
}

@Override
public String toString() {
    return "SMSListGetResponse [list=" + list + "]";
}

@JsonIgnoreProperties(ignoreUnknown = true)
public static class SMSList {
    private String list_id = "";
    private String list_name = "";

    public String getList_id() {
        return list_id;
    }
    public void setList_id(String list_id) {
        this.list_id = list_id;
    }
    public String getList_name() {
        return list_name;
    }
    public void setList_name(String list_name) {
        this.list_name = list_name;
    }
    @Override
    public String toString() {
        return "SMSList [list_id=" + list_id + ", list_name=" + list_name
                + "]";
    }


}
}

10-07 20:01