【问题标题】:Model structure to parse JSON with Retrofit [duplicate]使用 Retrofit 解析 JSON 的模型结构 [重复]
【发布时间】:2018-08-08 07:36:59
【问题描述】:

我有以下 JSON 结构:

[  
   {  
      "id":1,
      "name":"car",
      "elements":[  
         {  
            "id":1,
            "name":"price",
            "type":"textField",
            "constraints":"blablabla"
         },
         {  
            "id":2,
            "name":"color",
            "type":"textField",
            "constraints":"blablabla"
         },
         {  
            "id":3,
            "name":"images",
            "type":"image",
            "constraints":"blablabla"
         }
      ]
   }
]

我有以下型号:

public class Product {
    private Long id;
    private String name;
    @Expose
    private Element elements;

    public Product(Long id, String name, Element elements) {
        this.id = id;
        this.name = name;
        this.elements = elements;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Element getElements() {
        return elements;
    }
}

public class Element {
    private Long id;
    private String name;
    private String type;
    private String constraints;

    public Element(Long id, String name, String constraints, String type) {
        this.id = id;
        this.type=type;
        this.name = name;
        this.constraints = constraints;
    }

    public String getType() {
        return type;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getConstraints() {
        return constraints;
    }
}

Elements 模型有问题,我收到以下错误: 错误:java.lang.IllegalStateException:应为 BEGIN_OBJECT,但在第 1 行第 35 列路径 $[0].elements 处为 BEGIN_ARRAY

如何更改模型以使其正常工作?我试图将 Product 类中的元素更改为 JSONObject 数组,但是当我想解析时,它是空的。

【问题讨论】:

    标签: android json retrofit


    【解决方案1】:

    你需要像这样修改你的 POJO:

    Element.java

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class Element {
    
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("constraints")
    @Expose
    private String constraints;
    
    public Integer getId() {
    return id;
    }
    
    public void setId(Integer id) {
    this.id = id;
    }
    
    public String getName() {
    return name;
    }
    
    public void setName(String name) {
    this.name = name;
    }
    
    public String getType() {
    return type;
    }
    
    public void setType(String type) {
    this.type = type;
    }
    
    public String getConstraints() {
    return constraints;
    }
    
    public void setConstraints(String constraints) {
    this.constraints = constraints;
    }
    
    }
    

    Product.java

    import java.util.List;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class Product {
    
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("elements")
    @Expose
    private List<Element> elements = null;
    
    public Integer getId() {
    return id;
    }
    
    public void setId(Integer id) {
    this.id = id;
    }
    
    public String getName() {
    return name;
    }
    
    public void setName(String name) {
    this.name = name;
    }
    
    public List<Element> getElements() {
    return elements;
    }
    
    public void setElements(List<Element> elements) {
    this.elements = elements;
    }
    
    }
    

    P.S:您应该使用“http://www.jsonschema2pojo.org/”网站从您提供给它的 JSON 字符串自动生成 POJO。

    我希望这会有所帮助。

    【讨论】:

    • 谢谢它的工作。
    【解决方案2】:

    我认为您尝试将元素数组放入作为单个对象的“私有元素元素”中

    【讨论】:

      【解决方案3】:

      用这个改变你的 pojo。您也可以添加您需要的相应构造函数。

       public class Element {
      
      @SerializedName("id")
      @Expose
      private Integer id;
      @SerializedName("name")
      @Expose
      private String name;
      @SerializedName("type")
      @Expose
      private String type;
      @SerializedName("constraints")
      @Expose
      private String constraints;
      
      public Integer getId() {
      return id;
      }
      
      public void setId(Integer id) {
      this.id = id;
      }
      
      public String getName() {
      return name;
      }
      
      public void setName(String name) {
      this.name = name;
      }
      
      public String getType() {
      return type;
      }
      
      public void setType(String type) {
      this.type = type;
      }
      
      public String getConstraints() {
      return constraints;
      }
      
      public void setConstraints(String constraints) {
      this.constraints = constraints;
      }
      
      }
      
      public class Product {
      
      @SerializedName("id")
      @Expose
      private Integer id;
      @SerializedName("name")
      @Expose
      private String name;
      @SerializedName("elements")
      @Expose
      private List<Element> elements = null;
      
      public Integer getId() {
      return id;
      }
      
      public void setId(Integer id) {
      this.id = id;
      }
      
      public String getName() {
      return name;
      }
      
      public void setName(String name) {
      this.name = name;
      }
      
      public List<Element> getElements() {
      return elements;
      }
      
      public void setElements(List<Element> elements) {
      this.elements = elements;
      }
      
      }
      

      【讨论】:

        【解决方案4】:

        在 json 中,您有 Element 列表,在模型中,您将 Element 声明为 Object

        将此private Element elements; 更改为元素列表

        【讨论】:

          【解决方案5】:

          试试这个 pojo 或者你可以从这个 link 制作

            private String id;
          
          private String name;
          
          private ArrayList<Elements> elements;
          
          public String getId ()
          {
              return id;
          }
          
          public void setId (String id)
          {
              this.id = id;
          }
          
          public String getName ()
          {
              return name;
          }
          
          public void setName (String name)
          {
              this.name = name;
          }
          
          public ArrayList<Elements> getElements ()
          {
              return elements;
          }
          
          public void setElements (ArrayList<Elements> elements)
          {
              this.elements = elements;
          }
          
          @Override
          public String toString()
          {
              return "ClassPojo [id = "+id+", name = "+name+", elements = "+elements+"]";
          }
          
          public class Elements
          {
          private String id;
          
          private String name;
          
          private String constraints;
          
          private String type;
          
          public String getId ()
          {
              return id;
          }
          
          public void setId (String id)
          {
              this.id = id;
          }
          
          public String getName ()
          {
              return name;
          }
          
          public void setName (String name)
          {
              this.name = name;
          }
          
          public String getConstraints ()
          {
              return constraints;
          }
          
          public void setConstraints (String constraints)
          {
              this.constraints = constraints;
          }
          
          public String getType ()
          {
              return type;
          }
          
          public void setType (String type)
          {
              this.type = type;
          }
          
          @Override
          public String toString()
          {
              return "ClassPojo [id = "+id+", name = "+name+", constraints = "+constraints+", 
          type = "+type+"]";
          }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-16
            • 2015-04-27
            • 2018-04-12
            • 2019-01-19
            • 2017-04-06
            • 2015-11-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多