【问题标题】:Retrofit 2 RequestBody JsonArray改造 2 RequestBody JsonArray
【发布时间】:2016-04-11 23:35:46
【问题描述】:

如何将JSONArray 放入RequestBody 而不引发运行时异常?

@Multipart 
@POST("/call_method")
Call<MyResponse> callMethod(@Part("token")RequestBody token,@Part("params")RequestBody params);

我需要将JSONArray 放入参数中。我目前在做什么:

callMethod(RequestBody.create(MediaType.parse("text/plain"), token),
           RequestBody.create(MediaType.parse("text/plain"), jsonArrayParams));

但是当我执行这个方法时,我会得到一个运行时异常:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line

非常有趣:请求已执行(通过 CharlesProxy 检查),但由于运行时异常,我看不到它的结果。 如何修复此错误?

【问题讨论】:

  • 执行没问题,你的问题出在响应中,因为你声明接收一个对象,而你得到 Array 作为响应 Call&lt;MyResponse&gt; ... 应该更改为接收数组(从响应 JSON 解析)
  • 通过 Postman 检查响应 - 我得到 JSONObject 作为响应并在 MyResponse 中声明单个对象。
  • 当我尝试放置 JSONObject - 执行很好,但服务器没有收到 JSONObject,只有 JSONArray
  • @Yazan 你是对的。我不专心,注意到方括号...
  • 很高兴听到这个消息,如果您选择接受,我已经发布了完整的答案

标签: android retrofit


【解决方案1】:

执行没问题,你的问题在响应中,

预期为 BEGIN_OBJECT,但为 BEGIN_ARRAY

当您在接收数组时声明接收对象Call&lt;MyResponse&gt;

你需要改变回调中的类型如下

Call<MyResponse[]> callMethod(@Part("token")RequestBody token,@Part("params")RequestBody params);

或

Call<List<MyResponse>> callMethod(@Part("token")RequestBody token,@Part("params")RequestBody params);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 2018-08-06
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多