杰克逊分类功能与课程分开

时间:2016-01-28 21:18:03

标签: java jackson

我正在使用jackson来处理JSON(de)-serialization。我有一堆注释的类本质上是持有属性和相关的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 对象为Base。这是可能的(杰克逊是否做出保证 关于类的(非) - 多态序列化?

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

2 个答案:

答案 0 :(得分:0)

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

这是您要序列化的基类

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

答案 1 :(得分:-2)

你知道Gson吗?它是处理JSON的好库。

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

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

我认为最好的方法是添加注释或使用瞬态变量。 仅为了序列化的目的创建继承,对象在我的观点中无用地使应用程序复杂化......