我正在使用的视图模型有一个类似如下的方法:
public String getModelJson() {
final ItemModel model = this.getModel();
if (model == null) {
return StringUtils.EMPTY;
}
final GsonBuilder gsonBuilder = new GsonBuilder();
final Gson gson = gsonBuilder.create();
return gson.toJson(model);
}
这个方法依赖于com.google.gson.Gson::toJson将POJO模型序列化为可以在我的视图中使用的JSON字符串。
public final class ItemModel extends ContentFragmentModel {
@Expose
private String error;
@Expose
private String id;
@Expose
private String name;
public ItemModel(final ContentFragment fragment) {
super(fragment);
}
public String id() {
return this.id;
}
public String name() {
return this.name;
}
@Override
protected String getModelPath() {
return "/path/to/model";
}
}
当我从视图中调用getModelJson
时,该方法总是返回{}
,即使我可以证明模型被正确加载;如果我这样重写这个方法
public String getModelJson() {
final ItemModel model = this.getModel();
return model != null ? "{\"name\": \"" + model.getName() + "\"}";
}
...它返回预期输出:{"name": "item name"}
,其中item name
是从片段中正确加载的名称。
如何使模型正确序列化?
1条答案
按热度按时间ekqde3dh1#
我意识到了这个问题。下面是基本模型类的代码:
请注意,基本模型类和模型类都有一个名为
error
的成员。在基本类中,该成员是protected
。在扩展类中,它是private
。这显然在Java中有效-子类中的成员隐藏了父成员-但是类继承的这种奇怪用法似乎破坏了com.google.gson.Gson::toJson
。在the docs中没有提到这个方法,所以我在这里添加了一个帖子,希望如果他们遇到我遇到的同样的问题,可以保存一些可怜的灵魂几个小时。我的修复方法是从扩展类中删除
error
成员。我发现它实际上并没有什么用,所以我就删除了它。如果你遇到了一个不能简单删除的成员,你可以尝试重命名它,这样它就不会与基类中的成员冲突。