获取GsonConverterFactory来解析某些字段?

时间:2016-10-16 01:20:56

标签: java android json gson retrofit2

给出以下JSON响应:

{
    "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);
    }

1 个答案:

答案 0 :(得分:3)

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

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

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