首页 > 解决方案 > java.lang.IllegalStateException:应为 BEGIN_ARRAY,但路径为 BEGIN_OBJECT

问题描述

我在同一个 api 键中得到 JSON 对象或 JSON 数组的响应。我正在使用 Gson 解析数据,但是在解析 json 对象时我得到了如上所述的错误。但是 JSON 数组没问题。

使用 JSON 对象响应

    {
      "Code": "000",
      "Message": "Success",
      "RenewalPlans": {
        "RenewalPlan": {
          "PlanId": "123",
          "PlanName": "super plan",
          "PlanAmount": "6102"
        }
      }
    }

//json array
{
  "Code": "000",
  "Message": "Success",
  "RenewalPlans": {
    "RenewalPlan": [
      {
        "PlanId": "456",
        "PlanName": "super",
        "PlanAmount": "6102"
      },
      {
        "PlanId": "123",
        "PlanName": "Power plan",
        "PlanAmount": "123"
      }
    ]
  }
}

使用 Gson 解析数据

CustomerdetailsResponse customerDetailsResponse = new Gson().fromJson(new Gson().toJson(response), CustomerdetailsResponse.class);

CustomerdetailsResponse 类

public class CustomerdetailsResponse implements Serializable {
    @SerializedName("Code")
    @Expose
    private String mCode;
         

    @SerializedName("Message")
    @Expose
    private String mMessage

    @SerializedName("RenewalPlans")
    @Expose
    private RenewalPlans mRenewalPlans;
   
    public String getCode() {
        return mCode;
    }

    public void setCode(String code) {
        mCode = code;
    }

  
  

    public String getMessage() {
        return mMessage;
    }

    public void setMessage(String message) {
        mMessage = message;
    }

  

  

    public RenewalPlans getRenewalPlans() {
        return mRenewalPlans;
    }

    public void setRenewalPlans(RenewalPlans renewalPlans) {
        mRenewalPlans = renewalPlans;
    }

  

 

}

续订计划类

public class RenewalPlans implements Serializable {
    @SerializedName("RenewalPlan")
    @Expose

    private ArrayList<RenewalPlan> mRenewalPlan;

    public ArrayList<RenewalPlan> getRenewalPlan() {
        return mRenewalPlan;
    }

    public void setRenewalPlan(ArrayList<RenewalPlan> renewalPlan) {
        mRenewalPlan = renewalPlan;
    }

更新计划类

public class RenewalPlan implements Serializable {
    @SerializedName("PlanAmount")
    @Expose

    private String mPlanAmount;
    @SerializedName("PlanId")
    @Expose

    private String mPlanId;
    @SerializedName("PlanName")
    @Expose

    private String mPlanName;

    public String getPlanAmount() {
        return mPlanAmount;
    }

    public void setPlanAmount(String planAmount) {
        mPlanAmount = planAmount;
    }

    public String getPlanId() {
        return mPlanId;
    }

    public void setPlanId(String planId) {
        mPlanId = planId;
    }

    public String getPlanName() {
        return mPlanName;
    }

    public void setPlanName(String planName) {
        mPlanName = planName;
    }

}

标签: androidjsonparsinggsonjson-deserialization

解决方案


属性 mRenewalPlan 的 RenewalPlans 类类型应该是对象而不是 ArrayList。对象可以同时容纳两者。稍后您可以再次根据您的要求解析对象。


推荐阅读