【问题标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT Android Retrofit预期为 BEGIN_ARRAY,但为 BEGIN_OBJECT Android Retrofit
【发布时间】:2019-06-14 12:18:51
【问题描述】:

我在我的应用程序中使用 Retrofit 将数据从 JSON 读取到我的应用程序。我有这个 JSON。 (我尝试了很多解决方案,但对我没有任何效果)。请帮助我。我在其他 JSON 中使用了相同的代码代码,它适用于 This JSON URL,但不适用于我的 JSON

JSON My JSON is placed at this URL

我的界面:

    public interface SanaApi {

    String BASE_URL = "http://www.hhfoodies.com/salesnotifier/";

    @GET("sana_safinaz.php")
    Call<List<SanaSafinas>> getSana();
}

这是模型类:

  public class SanaSafinas {

    private String id;
    private String off;
    private String image;
    private String title;
    private String sale_price;
    private String original_price;

    public SanaSafinas(String id, String off, String image, String title, String sale_price, String original_price) {
        this.id = id;
        this.off = off;
        this.image = image;
        this.title = title;
        this.sale_price = sale_price;
        this.original_price = original_price;
    }

    public String getId() {
        return id;
    }

    public String getOff() {
        return off;
    }

    public String getImage() {
        return image;
    }

    public String getTitle() {
        return title;
    }

    public String getSale_price() {
        return sale_price;
    }

    public String getOriginal_price() {
        return original_price;
    }
}

这是主要活动:

 public class MainActivity extends AppCompatActivity {

    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.listViewHeroes);

        //calling the method to display the heroes
        getSana();
    }

    private void getSana() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(SanaApi.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
                .build();

        SanaApi api = retrofit.create(SanaApi.class);

        Call<List<SanaSafinas>> call = api.getSana();

        call.enqueue(new Callback<List<SanaSafinas>>() {
            @Override
            public void onResponse(Call<List<SanaSafinas>> call, Response<List<SanaSafinas>> response) {
                List<SanaSafinas> heroList = response.body();

                //Creating an String array for the ListView
                String[] heroes = new String[heroList.size()];

                //looping through all the heroes and inserting the names inside the string array
                for (int i = 0; i < heroList.size(); i++) {
                    heroes[i] = heroList.get(i).getSale_price();
                }


                //displaying the string array into listview
                listView.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, heroes));

            }



            @Override
            public void onFailure(Call<List<SanaSafinas>> call, Throwable t) {
                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }


}

【问题讨论】:

  • 您的模型类没有正确创建,好像您看到响应所有数据都在数据 JsonArray 中,并且您直接在那里工作,请更改您的模型类以使其正常工作
  • 复制你在jsonschema2pojo.org中的所有响应,它会自动创建你的模型类目标语言:java源类型:JSON注释样式:Gson并检查包括getter和setter

标签: android json retrofit retrofit2


【解决方案1】:

您的改造调用需要 List&lt;SanaSafinas&gt;,它是从 JSON 数组生成的。

你的 JSON 不是一个数组,它是一个对象,这就是你需要告诉改造你所期望的。

class Response {
  private final List<SanaSafinas> data;

  public Response(List<SanaSafinas> data) {
    this.data = data;
  }

  // Getter...
}

然后您的界面将如下所示:

public interface SanaApi {

String BASE_URL = "http://www.hhfoodies.com/salesnotifier/";

@GET("sana_safinaz.php")
Call<Response> getSana();

JSON 对象像你一样用花括号括起来:

{
  "message": "",
  "status": 1,
  "data": [
  {
    "id": "s18220052",
    "off": "50% Off",
    "image": "https://www.sanasafinaz.com/media/catalog/product/cache/2cf0e7f44e364cdf6f00ee795133d228/s/1/s18220052_1_.jpg",
    "title": "SAFARI-O",
    "sale_price": "PKR 2,720.00",
    "original_price": "PKR 5440 "
  },
...
}

JSON 数组用括号括起来,就像你的第一个 url:

[
  {
    "name": "Captain America",
    "realname": "Steve Rogers",
    "team": "Avengers",
   "firstappearance": "1941",
   ....
  },
  ...
}

【讨论】:

    【解决方案2】:

    您的模型类没有正确创建,就像您看到所有数据都在 data JsonArray 中的响应一样,并且您直接在那里进行工作,请更改您的模型类以使其正常工作

    创建一个包含您的响应的新类,将其命名为ResponseSana

    public class ResponseSana {
    
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("status")
    @Expose
    private Integer status;
    @SerializedName("data")
    @Expose
    private List< SanaSafinas > data = null;
    
    public String getMessage() {
    return message;
    }
    
    public void setMessage(String message) {
    this.message = message;
    }
    
    public Integer getStatus() {
    return status;
    }
    
    public void setStatus(Integer status) {
    this.status = status;
    }
    
    public List< SanaSafinas > getData() {
    return data;
    }
    
    public void setData(List< SanaSafinas > data) {
    this.data = data;
    }
    
    }
    

    你的界面应该是这样的

    Call<ResponseSana> getSana();
    

    然后根据更改的代码相应地更改您的 onResponse,所有数据都将正常工作,没有错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-14
      • 2016-09-26
      • 1970-01-01
      • 2016-08-20
      • 2018-01-12
      • 2019-05-10
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多