【问题标题】:retrofit Expected a string but was BEGIN_OBJECT at line 1 column 2 path $改造需要一个字符串,但在第 1 行第 2 列路径 $ 处是 BEGIN_OBJECT
【发布时间】:2018-06-26 02:10:42
【问题描述】:

我试图只获取字符串请求,但它给出了这样的错误

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我的 API 输出是这样的:

{
    "status": true,
    "message": "Video uploaded successfully!",
    "data": {
        "video_name": "674631516178278_abc2.mp4",
        "video_thumbnail": "674631516178278_thumb0017.jpg"
    }
}

响应代码:

        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            try {
                if (response.body() != null)
                    Log.e("UploadResponse>>>", response.body());
                layoutUpload.setVisibility(View.GONE);
                if (file.exists()) {
                    file.delete();
                    thumb.delete();
                }
            } catch (Exception e) {
                e.printStackTrace();
                layoutUpload.setVisibility(View.GONE);
                if (file.exists()) {
                    file.delete();
                    thumb.delete();
                }
            }
        }

【问题讨论】:

  • 能否请您发布您如何尝试解析响应的代码?
  • 请同时发布 POJO
  • json 是一个 JSONObject。您可能尝试将其解析为 JSONArray。
  • 而不是 String 使用 ResponseBody 你会得到成功响应

标签: android retrofit2


【解决方案1】:

这样试试

 @Override
    public void onResponse(Call<ResponseBody> call, Response< ResponseBody > response) {
        try {
            if (response.body() != null)
                Log.e("UploadResponse>>>", response.body());
            layoutUpload.setVisibility(View.GONE);
            if (file.exists()) {
                file.delete();
                thumb.delete();
            }
        } catch (Exception e) {
            e.printStackTrace();
            layoutUpload.setVisibility(View.GONE);
            if (file.exists()) {
                file.delete();
                thumb.delete();
            }
        }
    }

【讨论】:

  • 不是一个好的解决方案。正确的解决方案是根据服务器响应创建模型,而不是使用该模型的响应主体。可能是案例服务器响应消息视频上传不成功,对于这种情况,用户必须收到有关错误的通知。
  • 是的,正确的解决方案是创建一个 pojo 类,但是有人已经回答但不知道发生了什么,他删除了所以我建议这样
  • 我明白为什么@AMANSINGH 想要作为String 处理,因为通过json 解析处理不同的响应结构相对容易。不过,更好的做法是要求您使用类型转换器来完成这项繁重的工作。
  • @H4SN 从响应中读取字符串可能是一个正确的解决方案,并非所有用例都可以相同,您并不总是需要创建 POJO。所以这可能是一个很好的解决方案,我们只是不知道。
【解决方案2】:

.addConverterFactory(ScalarsConverterFactory.create()) .addxxxx

【讨论】:

    【解决方案3】:

    错误说你想在字符串正文中得到结果。 如果你想这样做, 只需在 Retrofit.Builder 中添加 ScalarsConverterFactory.create()。

    public static Retrofit getClient() {
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(getBaseUrl())
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        return retrofit;
    }
    

    在应用级 build.gradle 中使用改造实现。

    实现'com.squareup.retrofit2:converter-scalars:2.1.0'

    【讨论】:

    • 非常感谢。我只需要添加 ScalarsConverterFactory
    【解决方案4】:

    我也遇到过类似的问题。 Dattatray Nande 提供的答案,即在 Retrofit.Builder 中简单地添加 ScalarsConverterFactory.create() 有帮助。

    另外不要忘记在界面中添加如下所示的内容类型

    @Headers("Content-Type: text/html")
    @GET("/apiMethod")
    Call<String> YourAPIFunction();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多