[英]Why does com.google.gson.Gson::toJson return an empty object?
我正在處理的視圖 model 具有如下方法:
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);
}
This method relies on com.google.gson.Gson::toJson to serialize a POJO model to a JSON string that can be used in my view. 這是 model 代碼:
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
時,該方法總是返回{}
,即使我可以證明 model 正在正確加載; 如果我這樣重寫方法:
public String getModelJson() {
final ItemModel model = this.getModel();
return model != null ? "{\"name\": \"" + model.getName() + "\"}";
}
...它返回預期的 output: {"name": "item name"}
,其中item name
是從片段正確加載的名稱。
如何讓 model 正確序列化?
我意識到了這個問題。 這是基礎 model 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();
}
請注意,基礎 model class 和 model class 有一個成員error
。 在基礎 class 中,此成員protected
。 在擴展的 class 中,它是private
的。 This apparently works in Java - the member in the child class hides the parent member - but this weird usage of class inheritance seems to break com.google.gson.Gson::toJson
. 該方法的文檔中沒有提到這一點,所以我在這里添加一個帖子,希望如果他們遇到與我遇到的相同問題,他們可以在幾個小時內拯救一些可憐的靈魂。
對我來說,修復只是從擴展的 class 中刪除error
成員。 我發現它甚至沒有真正用於任何東西,所以我只是刪除了它。 如果您遇到無法簡單刪除的成員,您可以嘗試重命名它,使其不會與基礎 class 中的成員發生沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.