【问题标题】:Separate jackson feature from classes将杰克逊功能与类分开
【发布时间】:2016-01-28 21:18:03
【问题描述】:

我正在使用 jackson 来处理 JSON(反)序列化。我有一堆带有注释的类,它们本质上是持有属性和关联的 getter 和 setter 的对象。

但是,我经常发现在某些时候我想添加我不想包含在(反)序列化过程中的其他属性。这确实可以使用@JsonIgnore,但它让我觉得相对难看,因为我必须在任何地方添加注释并且一旦我忘记事情就会崩溃。

我想知道是否有更好的方法来分离被忽略的和序列化的属性。我有以下两个想法:

  • 使用继承,将new属性添加到继承的class

      // everything here should be (de)-serialized
      class Base {
        public int getJSONProperty() {...}
      }
    
      // nothing specific to the class Derived should be (de)-serialized
      class Derived extends Base {
        // *not* to be included
        public SomeClass getAdditionalProperty() {...}
      }
    

    但是,我不知道如何告诉杰克逊反序列化 Derived 对象为Bases。这可能吗(杰克逊是否做出保证 关于类的(非)多态序列化)?

  • 使用MixIn annotations。这将需要一个额外的摘要 每个现有类的类。我也不确定这是否解决了 问题。是没有出现在 MixIn 基类中的 getter 自动忽略还是我需要手动@JsonIgnore 他们?

【问题讨论】:

  • @JsonIgnoreProperties(ignoreUnknown=true) 怎么样?这将有效地反序列化仅存在于带有 json 注释 @JsonProperty 的类中的属性。在您的情况下,如果类成员值 private SomeClass additionalProperty 没有 @JsonProperty("additionalProperty") 注释,则根本不应该序列化。
  • 好吧,我也想在不同的位置(又名文件)拥有不同的属性......除此之外,我想它会起作用

标签: java jackson


【解决方案1】:

我已经看到您不喜欢我之前提供的解决方案,所以我再次在这里提供另一种使用 Gson 库做您想做的事情的方法。希望这次能帮到你。

这是您要序列化的基类

public class Base {
    public int getJSONProperty() {
        return jsonProperty;
    }
    private int jsonProperty = 2;
}

这是您不想序列化的派生类

public class Derived extends Base{
    public String getAdditionalProperty(){
        return additionalProperty;
    }
    private String additionalProperty = "value-not-to-serialize";
}

使用Type type = new TypeToken<Base>(){}.getType();,您可以定义用于序列化的类,以便使用以下方法获取 JSON 字符串:

Derived derived = new Derived();

Gson gson = new Gson();
Type type = new TypeToken<Base>(){}.getType();

String jsonString = gson.toJson(derived, type);

【讨论】:

    【解决方案2】:

    你认识高森吗?这是一个处理 JSON 的好库。

    您可以使用瞬态关键字来定义不必序列化的变量,这适用于 Gson(它应该适用于 jackson,但我不确定)...

    class Base {
        // (de)-serialized
        private int jsonProperty;
        // not (de)-serialized
        private transient SomeClass additionalProperty;
    }
    

    我认为最好的方法是添加注释或使用瞬态变量。 在我看来,仅为了序列化对象而创建继承会使应用程序复杂化...

    【讨论】:

    • 你能解释一下怎么回事吗?提前致谢
    猜你喜欢
    • 2011-08-25
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多