【问题标题】:Get GsonConverterFactory to parse certain fields?获取 GsonConverterFactory 来解析某些字段?
【发布时间】:2016-10-16 01:20:56
【问题描述】:

鉴于以下 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);
    }

【问题讨论】:

  • 您需要向我们展示您的 HavocAPI 接口和 getAllTask​​s api 的返回类型模型。问题很可能出在模型上。
  • 我很抱歉。我不认为这是必要的。我已经更新了 OP。

标签: java android json gson retrofit2


【解决方案1】:

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

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

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

【讨论】:

  • 那么在我的 API 中,我会执行以下操作:Observable&lt;GetTasksResponse&gt; getAllTasks()?
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多