基于另一个领域的杰克逊领域序列化

时间:2017-09-28 11:29:25

标签: java json serialization jackson

考虑到我有这样的模特:

public class Model {

    private String master;
    private Integer slave;
    private String notImportantField1;
    private String notImportantField2;
    private String notImportantField3;
    private String notImportantField4;
    private String notImportantField5;
    private String notImportantField6;
    private String notImportantField7;
    private String notImportantField8;
    private String notImportantField9;
    private String notImportantField10;
    private String notImportantField11;
    private String notImportantField12;
    private String notImportantField13;
    private String notImportantField14;
    private String notImportantField15;

    public void setMaster(String master) {
        this.master = master;
    };
    public String getMaster() {
        return master;
    };

    public void setSlave(Integer slave) {
        this.slave = slave;
    };
    public Integer getSlave() {
        return slave;
    };

    /** 
    * Similar getters/setters for other fields
    */
}

我想要的是" slave"的序列化值之后字段应该是不同的类型,取决于" master"场价值。例如,有条件:

masterCondition = master.equals("string");

如果" masterCondition"的结果是JSON是:

{
    "master": "master_value",
    "slave": "1234567890",
    **And all other fields as they are.**
}

正如您所看到的,我们在" slave"中有字符串值。领域。 如果" masterCondition"结果JSON是假的:

{
    "master": "master_value",
    "slave": 1234567890,
    **And all other fields as they are.**
}

正如您所看到的,在第二个响应中,我们在" slave"中有整数值。字段。

我尝试使用类级别的序列化程序,它适用于我,但这些方法为" notImportantFields"生成了很多样板代码。并且非空检查。

此外,我尝试使用ContextualSerializer,但如果我在字段级别使用此类序列化程序,它看起来无法获取另一个字段的值。 有没有办法在没有样板代码的情况下实现这种行为? 谢谢!

1 个答案:

答案 0 :(得分:2)

你可以通过宣布" smart"来欺骗杰克逊。 slave字段的getter。

声明这样的getter:

public Object getSlave() {
    if( "string".equals(master)) {
        return String.valueOf(slave);
    } else {
        return slave;
    }
}

杰克逊将根据返回值的确切类型在运行时转换它。