簡體   English   中英

為什么 com.google.gson.Gson::toJson 返回一個空的 ZA8CFDE63311C49EB2AC96B8666?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM