为什么 com.google.gson.Gson::toJson return 是一个空对象?
Why does com.google.gson.Gson::toJson return an empty object?
我正在处理的一个视图模型有一个类似的方法:
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
时,该方法总是 returns {}
,即使我可以证明模型正在正确加载;如果我这样重写方法:
public String getModelJson() {
final ItemModel model = this.getModel();
return model != null ? "{\"name\": \"" + model.getName() + "\"}";
}
...它 returns 预期输出:{"name": "item name"}
,其中 item name
是从片段中正确加载的名称。
如何让模型正确序列化?
我意识到了这个问题。这是基本模型的代码 class:
public abstract class ContentFragmentModel {
protected String error;
private boolean isValid = false;
public ContentFragmentModel(@NotNull final ContentFragment fragment) {
final String className = this.getClass().getSimpleName();
if (fragment == null) {
this.error = "No content fragment passed to " + className + ".";
return;
}
final String fragmentModelPath = FragmentUtil.getFragmentModelPath(
fragment
);
if (!fragmentModelPath.equals(this.getModelPath())) {
this.error = "Invalid content fragment passed to " + className + ".";
return;
}
this.loadElements(fragment);
this.isValid = true;
}
public @NotNull String getError() {
return StringUtils.defaultIfBlank(this.error, StringUtils.EMPTY);
}
public boolean isValid() {
return this.isValid;
}
protected abstract String getModelPath();
}
请注意,基本模型 class 和模型 class 有一个名为 error
的成员。在基地class中,这个成员是protected
。在扩展 class 中,它是 private
。这显然适用于 Java - 子 class 中的成员隐藏了父成员 - 但是 class 继承的这种奇怪用法似乎破坏了 com.google.gson.Gson::toJson
。 the docs 中没有提及该方法,所以我在这里添加一个 post,希望如果他们 运行 遇到我遇到的同一个问题,希望能节省几个小时的时间。
我的解决方法是从扩展 class 中删除 error
成员。我发现它甚至没有真正用于任何用途,所以我只是删除了它。如果您 运行 正在与一个不能简单删除的成员一起使用,您可以尝试重命名它,这样它就不会与基础 class.
中的成员冲突
我正在处理的一个视图模型有一个类似的方法:
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
时,该方法总是 returns {}
,即使我可以证明模型正在正确加载;如果我这样重写方法:
public String getModelJson() {
final ItemModel model = this.getModel();
return model != null ? "{\"name\": \"" + model.getName() + "\"}";
}
...它 returns 预期输出:{"name": "item name"}
,其中 item name
是从片段中正确加载的名称。
如何让模型正确序列化?
我意识到了这个问题。这是基本模型的代码 class:
public abstract class ContentFragmentModel {
protected String error;
private boolean isValid = false;
public ContentFragmentModel(@NotNull final ContentFragment fragment) {
final String className = this.getClass().getSimpleName();
if (fragment == null) {
this.error = "No content fragment passed to " + className + ".";
return;
}
final String fragmentModelPath = FragmentUtil.getFragmentModelPath(
fragment
);
if (!fragmentModelPath.equals(this.getModelPath())) {
this.error = "Invalid content fragment passed to " + className + ".";
return;
}
this.loadElements(fragment);
this.isValid = true;
}
public @NotNull String getError() {
return StringUtils.defaultIfBlank(this.error, StringUtils.EMPTY);
}
public boolean isValid() {
return this.isValid;
}
protected abstract String getModelPath();
}
请注意,基本模型 class 和模型 class 有一个名为 error
的成员。在基地class中,这个成员是protected
。在扩展 class 中,它是 private
。这显然适用于 Java - 子 class 中的成员隐藏了父成员 - 但是 class 继承的这种奇怪用法似乎破坏了 com.google.gson.Gson::toJson
。 the docs 中没有提及该方法,所以我在这里添加一个 post,希望如果他们 运行 遇到我遇到的同一个问题,希望能节省几个小时的时间。
我的解决方法是从扩展 class 中删除 error
成员。我发现它甚至没有真正用于任何用途,所以我只是删除了它。如果您 运行 正在与一个不能简单删除的成员一起使用,您可以尝试重命名它,这样它就不会与基础 class.