考虑到我有这样的模特:
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,但如果我在字段级别使用此类序列化程序,它看起来无法获取另一个字段的值。 有没有办法在没有样板代码的情况下实现这种行为? 谢谢!
答案 0 :(得分:2)
你可以通过宣布" smart"来欺骗杰克逊。 slave
字段的getter。
声明这样的getter:
public Object getSlave() {
if( "string".equals(master)) {
return String.valueOf(slave);
} else {
return slave;
}
}
杰克逊将根据返回值的确切类型在运行时转换它。