我正在使用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
吗?
答案 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)
你可以使用transient关键字定义不必序列化的变量,这适用于Gson(它应该适用于jackson,但我不确定)......
class Base {
// (de)-serialized
private int jsonProperty;
// not (de)-serialized
private transient SomeClass additionalProperty;
}
我认为最好的方法是添加注释或使用瞬态变量。 仅为了序列化的目的创建继承,对象在我的观点中无用地使应用程序复杂化......