目前我正在和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
扩展的另一个类LastChangepublic 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忽略类属性?
提前致谢。
答案 0 :(得分:1)
构建新的gson实例时:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
使用@Expose注释要序列化的每个字段:
@Expose
public Config config;
编辑: 一个小的注意事项 - 尽量避免在模型中保留对视图(或任何与Context相关的对象)的引用。如果以静态方式保留此模型的实例,并且它有点混合表示和数据层,则可能会遇到内存泄漏,这对于代码可读性和可维护性来说绝对不是好事。