为什么com.google.gson.gson::toJson返回一个空对象?

yk9xbfzb  于 2022-11-23  发布在  Go
关注(0)|答案(1)|浏览(354)

我正在使用的视图模型有一个类似如下的方法:

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是从片段中正确加载的名称。
如何使模型正确序列化?

ekqde3dh

ekqde3dh1#

我意识到了这个问题。下面是基本模型类的代码:

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();
}

请注意,基本模型类和模型类都有一个名为error的成员。在基本类中,该成员是protected。在扩展类中,它是private。这显然在Java中有效-子类中的成员隐藏了父成员-但是类继承的这种奇怪用法似乎破坏了com.google.gson.Gson::toJson。在the docs中没有提到这个方法,所以我在这里添加了一个帖子,希望如果他们遇到我遇到的同样的问题,可以保存一些可怜的灵魂几个小时。
我的修复方法是从扩展类中删除error成员。我发现它实际上并没有什么用,所以我就删除了它。如果你遇到了一个不能简单删除的成员,你可以尝试重命名它,这样它就不会与基类中的成员冲突。

相关问题