【问题标题】:Deserializing ArrayList<Interface> using GSON使用 GSON 反序列化 ArrayList<Interface>
【发布时间】:2016-07-08 22:20:13
【问题描述】:

我有一堂课Shop

public class Shop {

  private String name;
  private ArrayList<Fruitable> fruits;


  public String toJson() {
     Gson gson = new Gson();
     return gson.toJson(this, Shop.class) 
  }   

}

AppleOrange是实现Fruitable接口的两个类。

Fruitable:

public interface Fruitable {
   String getColor();
}

Apple:

public class Apple implements Fruitable {

 private int Id;     

 @Override
 public String getColor() {
    return "red";
  }

 }

Orange:

 public class Orange implements Fruitable {

 private int Id;

 @Override
 public String getColor() {
    return "orange";
  }

 }

我可以使用 GSON 序列化 Shop,但是我无法正确反序列化它。

当我反序列化时,ArrayList&lt;Fruitable&gt; 有对象,但对象是null

这是因为 GSON 需要一个具体实例才能反序列化。

我知道我可以在 Shop 中实现 JsonDeserializer

但是,我可以在 AppleOrange 内部实现一些反序列化机制,以便它们自己反序列化吗?

如果这不可能,并且我必须在 Shop 中编写反序列化程序,我可以编写代码来反序列化 fruits 属性而不是其他属性,即GSON 是否会反序列化剩余的属性,假设它们是具体实例?

【问题讨论】:

    标签: android serialization deserialization json-deserialization gson


    【解决方案1】:

    好的,所以您应该使用 GSON 注释,它们会让您的生活变得更轻松。 一个例子:

    public class Deal{
    
       @SerializedName("name")
       String name;
    
       @SerializedName("times")
       List<DealTime> times;
    
    }
    

    返回的json大概是这样的:

    {
       name:dave,
       times[
         {
          end:400,
          start:200
         },
         {
          end:30,
          start:500
         }
       ]
    }
    

    那么您的 DealTime 类将具有以下内容:

       public class DealTime{
    
           @SerializedName("end")
           int end;
    
           @SerializedName("start")
           int start;
    
        }
    

    您所要做的就是使用 Deal 对象将返回的 json 与 GSON 一起转换。 希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多