2015-04-01 97 views
0

我寫即利用robospice,改造一個Android應用程序,和傑克遜2.4.X,改造:錯誤反序列化數組與一個元素:「出START_ARRAY令牌」

這裏是我嘗試反序列化JSON的這是從休息服務回來的。返回的「data」數組中的元素是我想要反序列化的Notification對象。

{ 
    "data": [ 
     { 
     "uuid": "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX", 
     "AcctNo": "XXXXXXXXXX", 
     "title": "Test Notification", 
     "content": "Here is some content.", 
     "date": "2015-03-24" 
     } 
    ] 
    } 

我第一次包裹在NotificationResponse對象的響應:

@JsonRootName(value = "data") 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class NotificationResponse { 

    @JsonUnwrapped 
    public Notification[] notifications; 
} 

通知對象看起來是這樣的:

public class Notification { 

     @JsonProperty("uuid") 
     public String Uuid; 

     @JsonProperty("AcctNo") 
     public String acctNo; 

     @JsonProperty("title") 
     public String title; 

     @JsonProperty("content") 
     public String content; 

     @JsonProperty("date") 
     public String date; 

    } 

堆棧跟蹤:

04-01 11:51:17.326 18978-19463/com.xxxxx.android E/﹕ An exception occurred during request network execution :com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.xxxxx.android.model.NotificationResponse out of START_ARRAY token 
       at [Source: re[email protected]8b4da58; line: 1, column: 2] 
     retrofit.RetrofitError: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.xxxxx.android.model.NotificationResponse out of START_ARRAY token 
       at [Source: re[email protected]8b4da58; line: 1, column: 2] 
       at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:383) 
       at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
       at java.lang.reflect.Proxy.invoke(Proxy.java:397) 
       at $Proxy15.notifications(Unknown Source) 
       at com.xxxxx.android.network.spice.NotificationSpiceRequest.loadDataFromNetwork(NotificationSpiceRequest.java:21) 
       at com.xxxxx.android.network.spice.NotificationSpiceRequest.loadDataFromNetwork(NotificationSpiceRequest.java:9) 
       at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:48) 
       at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:150) 
       at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:217) 
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
       at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
       at java.lang.Thread.run(Thread.java:818) 
     Caused by: retrofit.converter.ConversionException: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.xxxxx.android.model.NotificationResponse out of START_ARRAY token 
       at [Source: re[email protected]8b4da58; line: 1, column: 2] 
       at retrofit.converter.JacksonConverter.fromBody(JacksonConverter.java:40) 
       at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:367) 
                at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
                at java.lang.reflect.Proxy.invoke(Proxy.java:397) 
                at $Proxy15.notifications(Unknown Source) 
                at com.xxxxx.android.network.spice.NotificationSpiceRequest.loadDataFromNetwork(NotificationSpiceRequest.java:21) 
                at com.xxxxx.android.network.spice.NotificationSpiceRequest.loadDataFromNetwork(NotificationSpiceRequest.java:9) 
                at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:48) 
                at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:150) 
                at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:217) 
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
                at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                at java.lang.Thread.run(Thread.java:818) 
     Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.xxxxx.android.model.NotificationResponse out of START_ARRAY token 
       at [Source: re[email protected]8b4da58; line: 1, column: 2] 
       at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:749) 
       at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:745) 
       at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1203) 
       at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:147) 
       at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126) 
       at com.fasterxml.jackson.databind.ObjectMapper._unwrapAndDeserialize(ObjectMapper.java:3126) 
       at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3049) 
       at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2206) 
       at retrofit.converter.JacksonConverter.fromBody(JacksonConverter.java:36) 
                at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:367) 
                at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
                at java.lang.reflect.Proxy.invoke(Proxy.java:397) 
                at $Proxy15.notifications(Unknown Source) 
                at com.xxxxx.android.network.spice.NotificationSpiceRequest.loadDataFromNetwork(NotificationSpiceRequest.java:21) 
                at com.xxxxx.android.network.spice.NotificationSpiceRequest.loadDataFromNetwork(NotificationSpiceRequest.java:9) 
                at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:48) 
                at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:150) 
                at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:217) 
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
                at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                at java.lang.Thread.run(Thread.java:818) 

在此先感謝。讓我知道你是否需要任何進一步的信息。

編輯:我忘了提,我使用了以下內容:

ObjectMapper om = new ObjectMapper(); 
om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 
+0

作爲每回答,是的,只是改變類型。但是還要注意'@ JsonUnwrapped'在這裏被忽略,因爲它只能用於JSON對象而不是數組。有幾種方法可以將「單個元素」數組「解開」爲一個值,然後啓用「DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY」。這對傳統的JSON有時很有用。 – StaxMan 2015-04-01 21:48:54

回答

1

您需要在您的NotificationResponse對象與@JsonCreator註釋這樣的構造:

@JsonCreator 
public NotificationResponse(Notification[] notifications) { 
    this.notifications = notifications; 
} 
+0

工程就像一個魅力。謝謝。 – 2015-04-01 17:25:58

相關問題