【问题标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT in Retrofit预期 BEGIN_ARRAY 但在改造中是 BEGIN_OBJECT
【发布时间】:2026-01-25 22:35:02
【问题描述】:

我是 android 编程新手,任何人都可以帮助我或指出为什么它给我这个错误 我想从服务器获取一些数据,例如在硬件 json 下并获取名称和状态,但是当我调用 api 时,它会显示给我。

【问题讨论】:

标签: java android api retrofit


【解决方案1】:

您的响应返回一个对象而不是数组。

代替

@GET("system_monitor")
Call<List<ObjectList>> getHardware();

使用

@GET("system_monitor")
Call<ObjectList> getHardware();

然后像下面这样使用它:

Call<ObjectList> call = webRequestAPI.getHardware();

call.enqueue(new Callback<ObjectList>() {
    @Override
    public void onResponse(Call<ObjectList> call, Response<ObjectList> response) {

        if (!response.isSuccessful()) {
            textViewHardwareName.setText("Code: " + response.code());
            return;
        }

        ObjectList system_monitor = response.body();

        ...
    }

    @Override
    public void onFailure(Call<ObjectList> call, Throwable t) {
        textViewHardwareName.setText(t.getMessage());

    }
});

【讨论】:

  • @YenBiko,这里有解决方案。检查并告诉我
【解决方案2】:

换行

public void onResponse(Call<List<ObjectList>> call, Response<List<ObjectList>> response) {

public void onResponse(Call<List<ObjectList>> call, Response<ObjectList> response) {

【讨论】:

    【解决方案3】:

    根据您的代码,您期望响应为 List。但实际反应是对象。因此,您需要根据您的响应生成模型类并在代码中设置输出。

    你的模型应该是这样的:

    public class Application {
      ArrayList<Object> hardware = new ArrayList<Object>();
      Header HeaderObject;
      ArrayList<Object> software = new ArrayList<Object>();
    
    
     // Getter Methods 
    
      public Header getHeader() {
        return HeaderObject;
      }
    
     // Setter Methods 
    
      public void setHeader( Header headerObject ) {
        this.HeaderObject = headerObject;
      }
    }
    public class Header {
      Stamp StampObject;
      private String frame_id;
      private float seq;
    
    
     // Getter Methods 
    
      public Stamp getStamp() {
        return StampObject;
      }
    
      public String getFrame_id() {
        return frame_id;
      }
    
      public float getSeq() {
        return seq;
      }
    
     // Setter Methods 
    
      public void setStamp( Stamp stampObject ) {
        this.StampObject = stampObject;
      }
    
      public void setFrame_id( String frame_id ) {
        this.frame_id = frame_id;
      }
    
      public void setSeq( float seq ) {
        this.seq = seq;
      }
    }
    public class Stamp {
      private float secs;
      private float nsecs;
    
    
     // Getter Methods 
    
      public float getSecs() {
        return secs;
      }
    
      public float getNsecs() {
        return nsecs;
      }
    
     // Setter Methods 
    
      public void setSecs( float secs ) {
        this.secs = secs;
      }
    
      public void setNsecs( float nsecs ) {
        this.nsecs = nsecs;
      }
    }
    

    然后更改以下行:

    public void onResponse(Call<List<ObjectList>> call, Response<Application> response) {
    

    【讨论】:

      【解决方案4】:

      改变这个:

      @GET("system_monitor")
      Call<List<ObjectList>> getHardware();
      

      @GET("system_monitor")
      Call<ObjectList> getHardware();
      

      【讨论】:

        【解决方案5】:

        最适合您的场景硬件和软件的东西是对象,它们有两个属性 1.名称 2.对象状态。

        所以我建议你创建一个类名 System 并将这两个变量放在那里,这样你的类最终看起来像:

        Class System 
         {
        String object_name;
        boolean object_status; 
         }
        

        还有你的 getter setter 。 并像这样更新您的模型类

        @SerializedName("hardware")
        @Expose
        public List<System> hardware;
        
        @SerializedName("software")
        @Expose
        public List<System> software;
        

        并将您的改造响应持有人更改为。

        public void onResponse(Call<List<ObjectList>> call, Response<ObjectList> 
        response) {
        

        【讨论】: