【问题标题】:Retrofit 2 "Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $"改造 2“预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT”
【发布时间】:2016-08-23 23:32:36
【问题描述】:

我曾经在其他帖子上寻找过这个问题,但我无法与他们一起解决。

格式化 JSON 响应:

{  
   "products":[  
      {  
         "name":"Top fluide doubl\u00e9",
         "description":"DESCRIPTION ........"
      },
      {  
         "name":"Sweat avec fentes lat\u00e9rales",
         "description":"DESCRIPTION ........"
      },
      {  
         "name":"Robe \u00e9paules d\u00e9nud\u00e9es",
         "description":"DESCRIPTION ........"
      },
      {  
         "name":"Blouson bomber \u00e0 zip imprim\u00e9",
         "description":"DESCRIPTION ........"
      }
   ],
   "success":4
}

改造 2 的 API

@GET("products")
    Call<List<ProductTest>> getProductList();

@GET("products/{product}")
Call<ProductTest> getProduct(@Path("product") int product);

@GET("success")
Call<SuccessTest> getSuccessNb();

JAVA 产品类

public class ProductTest {
    String name;
    String description;

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

改造 2 构建器

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:80/App/PHP_script/reading_all_products.php/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
CatalogAPI service = retrofit.create(CatalogAPI.class);

正在努力获得 JSON 响应成功的服务

service.getSuccessNb().enqueue(new Callback<SuccessTest>() {
            @Override
            public void onResponse(Call<SuccessTest> call, Response<SuccessTest> response) {
                if(response.isSuccessful())
                {
                    Log.i("retrofit : ", "" + response.body().getSuccess());
                }
                else
                {
                    Log.i("retrofit : ", "NULL BODY -> " + response.errorBody());
                }
            }

            @Override
            public void onFailure(Call<SuccessTest> call, Throwable t) {
                Log.i("retrofit : ", "onFailure -> " + t.getLocalizedMessage());

            }
        });

无法获取产品列表或列表中的一个产品的服务

service.getProductList().enqueue(new Callback<List<ProductTest>>() {
            @Override
            public void onResponse(Call<List<ProductTest>> call, Response<List<ProductTest>> response) {
                Log.i("retrofit : ", "pre-ok");

                if(response.isSuccessful())
                {
                    Log.i("retrofit : ", "ok");
                }
                else
                {
                    Log.i("retrofit : ", "NULL BODY -> " + response.errorBody());
                }
            }

            @Override
            public void onFailure(Call<List<ProductTest>> call, Throwable t) {
                Log.i("retrofit : ", "onFailure -> " + t.getLocalizedMessage());
            }
        });

       service.getProduct(2).enqueue(new Callback<ProductTest>() {
            @Override
            public void onResponse(Call<ProductTest> call, Response<ProductTest> response) {
                if(response.isSuccessful())
                {
                    Log.i("retrofit : ", "" + response.message());
                    Log.i("retrofit : ", response.body().getName() + " => " + response.body().getDescription());
                }
                else
                {
                    Log.i("retrofit : ", "NULL BODY -> " + response.errorBody());
                }
            }

            @Override
            public void onFailure(Call<ProductTest> call, Throwable t) {
                Log.i("retrofit : ", "onFailure -> " + t.getLocalizedMessage());
            }
        });

最后两种情况显示错误:

应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT。

我使用了一个运行良好的包装类,但我想对这种情况进行一些解释,以便完美理解 Retrofit 2 和 JSON 之间的通信

【问题讨论】:

    标签: android json retrofit retrofit2


    【解决方案1】:

    传入的json

    {  <- indicates its a object
       "products":[  <- this object has a field called products and its value is array
    

    表示有一个字段作为产品的对象,该字段是一个列表。

    class ProductsResponse {
    List<Products> products;
    

    【讨论】:

    • 检查更新..希望这有助于您理解 json 格式
    • 非常感谢,但是我如何才能通过改造获得数组“产品”中的一个对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多