2016-10-16 41 views
0

鉴于以下JSON响应:获取GsonConverterFactory来解析某些字段?

{ 
    "status":true, 
    "doc":[ 
     { 
      "_id":"9374", 
      "t_id":"5678", 
      "name":"Do calculus homework", 
      "description":"Finish all assigned homework from chapters 1 and 2", 
      "category":"test", 
      "indexInList":0, 
      "priority":3, 
      "dateDue":1477291500000, 
      "user":"def", 
      "status":"ARCHIVED", 
      "__v":0, 
      "subtasks":[ 
       { 
        "name":"Finish Chapter 1 - Derivatives", 
        "isCompleted":false 
       }, 
       { 
        "name":"Finish Chapter 1 - Integrals", 
        "isCompleted":false 
       }, 
       { 
        "name":"Finish Chapter 2 - Graphing", 
        "isCompleted":false 
       } 
      ] 
     }, 
     { 
      "_id":"429808", 
      "t_id":"1234", 
      "name":"Write machine learning essay", 
      "description":"Write essay on Bayesian networks", 
      "category":"test", 
      "indexInList":1, 
      "priority":3, 
      "dateDue":1477291500000, 
      "user":"abc", 
      "status":"ARCHIVED", 
      "__v":0, 
      "subtasks":[ 
       { 
        "name":"Write introduction", 
        "isCompleted":false 
       }, 
       { 
        "name":"Write body", 
        "isCompleted":false 
       }, 
       { 
        "name":"Write Conclusion", 
        "isCompleted":false 
       } 
      ] 
     } 
    ] 
} 

我与Retrofit2一起用这个。我的服务类看起来是这样的:

private HavocService(String baseUrl) { 
     //So network calls are async 
     RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()); 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

     final Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(baseUrl) 
       .client(client) 
       .addCallAdapterFactory(rxAdapter) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     mHavocApi = retrofit.create(HavocAPI.class); 
    } 

,我实际处理中获得的RX任务数据:

rxHelper.manageSubscription(HavocService.getInstance().getHavocAPI().getAllTasks(userId) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .compose(RxTiPresenterUtils.deliverLatestToView(this)) 
       .subscribe(mListOfTasks -> { 
        this.mListOfTasks = mListOfTasks; 
        getView().setTaskList(mListOfTasks); 
       }, throwable -> { 
        LogUtil.e("Error with something."); 
       }) 
     ); 

我如何告诉我GSONConverterFactory开始在"doc"阵列解析?我并不在乎第一个"status"字段。

我问,因为我得到以下错误:java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $。我很确定这是因为GSON试图解析第一个项目而不是"doc"阵列。

我感谢任何和所有的帮助!

编辑

这里是HavocAPI (我只关心getAllTasks()现在的工作。)

public interface HavocAPI { 

     /** 
     * Creates a new Task 
     * 
     * @return status of whether or not the transaction was successful and the task that was created 
     */ 
     @Headers({"Accept: application/json", "Content-Type: application/json"}) 
     @POST("task/create/") 
     Observable<List<Object>> createNewTask(); 

     /** 
     * Deletes a specified Task using the taskId 
     * 
     * @param taskID of the task 
     * @return status of transaction 
     */ 
     @Headers({"Accept: application/json", "Content-Type: application/json"}) 
     @POST("task/delete/{task_id}/") 
     Observable<Boolean> deleteTask(@Path("task_id") String taskID); 

     /** 
     * Updates a Task 
     * 
     * @return status of whether or not the transaction was successful and the task that was updated 
     */ 
     @Headers({"Accept: application/json", "Content-Type: application/json"}) 
     @POST("task/update/") 
     Observable<List<Object>> updateTask(); 

     /** 
     * Gets all Tasks by a specified User 
     * 
     * @param userId of the user 
     * @return list of all Tasks from the specified User 
     */ 
     @Headers({"Accept: application/json", "Content-Type: application/json"}) 
     @GET("task/read/{user_id}/") 
     Observable<List<Task>> getAllTasks(@Path("user_id") String userId); 
    } 
+0

您需要向我们展示您的'HavocAPI'接口和您的getAllTask​​s api的返回类型模型。这个问题很可能与模型有关。 –

+0

我的歉意。我不认为这是必要的。我已经更新了OP。 – Nxt3

回答

1

getAllTasks()方法的返回类型不正确。您需要创建一个代表实际响应格式的新模型,然后通过它访问任务列表。

class GetTasksResponse { 
    bool status; 
    @SerializedName("doc") 
    List<Task> tasks; 

    public List<Task> getTasks() { 
     return tasks; 
    } 
} 
+0

那么在我的API中,我会做类似于:'Observable getAllTask​​s()'? – Nxt3

+0

使用我上面的评论作品。 – Nxt3