2014-03-31 40 views
1

我正在爲Android上的聊天編寫APE協議的實現。當我發送請求連接的答案是:傑克遜 - 不能序列化數組,UnknownLengthHttpInputStream

[ 
    { 
     "time": "1396265282", 
     "raw": "LOGIN", 
     "data": { 
      "sessid": "51da81ceb3acd4655f95d00c29d058a0" 
     } 
    }, 
    { 
     "time": "1396265282", 
     "raw": "IDENT", 
     "data": { 
      "user": { 
       "casttype": "uni", 
       "pubid": "fd1e5426d381e5c9ac4e3b0cb32622d7", 
       "properties": { 
        "channel": "chat", 
        "uid": "undefined", 
        "type": "0", 
        "name": "test1426" 
       } 
      } 
     } 
    } 
] 

我的POJO是:

public class ConnectResponse { 
    public BasicInfo[] response; 

    public static class BasicInfo { 
     public String time; 
     public String raw; 
     public Data data; 
    } 


    public static class Data { 
     public String sessionid; 
     public User user; 
    } 

    public static class User { 
     public String casttype; 
     public String pubid; 
     public Properties properties; 
    } 

    public static class Properties{ 
     public String channel; 
     public String uid; 
     public int type; 
     public String name; 
    } 
} 

當解析JSON我有例外:

03-31 13:37:09.258 16829-17365/com.miquido.vheda_android E//DefaultRequestRunner.java:138﹕ 13:37:09.257 Thread-38761 An exception occurred during request network execution :Could not read JSON: Can not deserialize instance of com.miquido.vheda_android.chat.response.ConnectResponse out of START_ARRAY token 
      at [Source: [email protected]; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.miquido.vheda_android.chat.response.ConnectResponse out of START_ARRAY token 
      at [Source: [email protected]; line: 1, column: 1] 
    org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.miquido.vheda_android.chat.response.ConnectResponse out of START_ARRAY token 
      at [Source: [email protected]; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.miquido.vheda_android.chat.response.ConnectResponse out of START_ARRAY token 
      at [Source: [email protected]; line: 1, column: 1] 
      at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:125) 
      at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147) 
      at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76) 
      at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:655) 
      at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:641) 
      at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:484) 
      at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439) 
      at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:340) 
      at com.miquido.vheda_android.chat.request.ConnectRequest.loadDataFromNetwork(ConnectRequest.java:45) 
      at com.miquido.vheda_android.chat.request.ConnectRequest.loadDataFromNetwork(ConnectRequest.java:23) 
      at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:45) 
      at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:134) 
      at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:201) 
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
      at java.lang.Thread.run(Thread.java:856) 
    Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.miquido.vheda_android.chat.response.ConnectResponse out of START_ARRAY token 
      at [Source: [email protected]; line: 1, column: 1] 
      at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) 
      at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212) 
      at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromArray(BeanDeserializer.java:869) 
      at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:597) 
      at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723) 
      at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1914) 
      at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:122) 
            at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147) 
            at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76) 
            at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:655) 
            at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:641) 
            at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:484) 
            at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439) 
            at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:340) 
            at com.miquido.vheda_android.chat.request.ConnectRequest.loadDataFromNetwork(ConnectRequest.java:45) 
            at com.miquido.vheda_android.chat.request.ConnectRequest.loadDataFromNetwork(ConnectRequest.java:23) 
            at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:45) 
            at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:134) 
            at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:201) 
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
            at java.lang.Thread.run(Thread.java:856) 

所以例外是:UnknownLengthHttpInputStream。 也許這可能是問題:服務器的響應內容類型是text/html(我無法更改它),因此我使用 - method將此類型添加到Jackson轉換器支持的媒體類型。 難道是錯誤的原因?根據您的POJO

回答

1

其實在我的情況下從評論鏈接不是答案。我無法使用ObjectMapper,因爲它是自動爲我的其他庫完成的。 解決方案是使POJO擴展ArrayList。

0

,傑克遜將期待一個JSON這樣的:

{ 
    "response": [ 
     { 
      "time": "1396265282", 
      "raw": "LOGIN", 
      "data": { 
       "sessid": "51da81ceb3acd4655f95d00c29d058a0" 
      } 
     }, 
     { 
      "time": "1396265282", 
      "raw": "IDENT", 
      "data": { 
       "user": { 
        "casttype": "uni", 
        "pubid": "fd1e5426d381e5c9ac4e3b0cb32622d7", 
        "properties": { 
         "channel": "chat", 
         "uid": "undefined", 
         "type": "0", 
         "name": "test1426" 
        } 
       } 
      } 
     } 
    ] 
} 

所以,你必須要麼改變你POJO或更改你的迴應匹配。

+0

如果響應以數組標記開始,應如何更改我的POJO?我之前只使用JSON開始工作{並且在Internet上我沒有看到明確的示例。 POJO應該如何成爲一個數組? – marcinm

+0

[這個答案](http://stackoverflow.com/questions/8263008/how-to-deserialize-json-file-starting-with-an-array-in-jackson)應該可以幫到你 –