为什么 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::toJsonthe docs 中没有提及该方法,所以我在这里添加一个 post,希望如果他们 运行 遇到我遇到的同一个问题,希望能节省几个小时的时间。

我的解决方法是从扩展 class 中删除 error 成员。我发现它甚至没有真正用于任何用途,所以我只是删除了它。如果您 运行 正在与一个不能简单删除的成员一起使用,您可以尝试重命名它,这样它就不会与基础 class.

中的成员冲突