GSON应该忽略未出现在JSON中的类属性

时间:2016-08-24 13:01:15

标签: android gson

目前我正在和GSON一起玩,遇到了一些我自己无法解决的麻烦。

我有这三个班: 一个抽象类CustomEntity

public abstract class CustomEntity {
     private View customView;

     public CustomEntity() {}

     public void setCustomView(View customView) {
        this.customView = customView;
     }

     public View getCustomView() {
        return customView;
     }
}

从CustomEntity

扩展的另一个类LastChange
public class LastChange extends CustomEntity {

   public Config config;

   public LastChange() {}

   @Override
   public String toString() {
       return "LastChange:" + config.toString();
   }

   public Config getConfig() {
       return config;
   }

   public void setConfig(Config config) {
       this.config = config;
   }
}

第三类Config

public class Config extends CustomEntity {

   public String config;
   public String nav_items;

   public Config() {}

   @Override
   public String toString() {
       return "config data:" + config + ", " + nav_items;
   }

   public String getConfig() {
       return config;
   }

   public void setConfig(String config) {
       this.config = config;
   }

   public String getNav_items() {
       return nav_items;
   }

   public void setNav_items(String nav_items) {
       this.nav_items = nav_items;
   }
}

在MainActivity中,我尝试使用GSON将以下JSON反序列化为LastChange对象。

String lastChangeJson = "{\"config\":{\"config\":\"2016-07-20 15:32:14\",\"nav_items\":\"2016-08-24 12:36:06\"},\"background_images\":{\"background_url_landscape\":\"2015-07-28 17:21:56\",\"background_url\":\"2015-07-28 17:21:56\",\"icon_for_accessory_view\":\"2015-07-28 17:21:56\",\"icon_for_route_view\":\"2015-07-28 17:21:56\",\"background_url_landscape_big\":\"2015-07-28 17:21:56\",\"background_url_big\":\"2015-07-28 17:21:56\"},\"nav_content\":[{\"last_change\":\"2016-06-29 11:06:16\",\"pageId\":\"10262\"},{\"last_change\":\"2016-08-24 12:36:06\",\"pageId\":\"10264\"},{\"last_change\":\"2016-08-09 16:13:03\",\"pageId\":\"10378\"},{\"last_change\":\"2016-08-09 16:13:03\",\"pageId\":\"10263\"},{\"last_change\":\"2016-07-20 15:32:14\",\"pageId\":\"10265\"}]}";

CustomEntity lastChangeEntity = gson.fromJson(lastChangeJson, LastChange.class);

上面的代码给出了以下异常:

java.lang.SecurityException: Can't make method constructor accessible
at java.lang.reflect.Constructor.setAccessible(Constructor.java:336)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:101)
at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:83)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.Gson.getAdapter(Gson.java:423)...

但是如果我删除属性" customView"从CustomEntity类及其getter和setter开始,反序列化工作正常。

如果他们不能出现在我的json中,任何人都知道如何告诉GSON忽略类属性?

提前致谢。

1 个答案:

答案 0 :(得分:1)

构建新的gson实例时:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

使用@Expose注释要序列化的每个字段:

@Expose   
public Config config;

编辑: 一个小的注意事项 - 尽量避免在模型中保留对视图(或任何与Context相关的对象)的引用。如果以静态方式保留此模型的实例,并且它有点混合表示和数据层,则可能会遇到内存泄漏,这对于代码可读性和可维护性来说绝对不是好事。