java.lang.IllegalStateException:应为 BEGIN_ARRAY,但路径为 BEGIN_OBJECT

Posted

技术标签:

【中文标题】java.lang.IllegalStateException:应为 BEGIN_ARRAY,但路径为 BEGIN_OBJECT【英文标题】:java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at path 【发布时间】:2020-11-15 22:18:17 【问题描述】:

我在同一个 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;
    

  

 

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;
    

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;
    


【问题讨论】:

请分享 CustomerdetailsResponse 类 您能在我发布所需课程时查看我的问题吗? @ShaluTD 问题来自服务设计,它应该以相同的方式提供响应(例如,始终将RenewalPlans 作为 json 数组返回)。我认为使用gson 你将无法解析这样的 json 字符串。 【参考方案1】:

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

【讨论】:

制作对象然后解析成功了。谢谢

以上是关于java.lang.IllegalStateException:应为 BEGIN_ARRAY,但路径为 BEGIN_OBJECT的主要内容,如果未能解决你的问题,请参考以下文章