【问题标题】:Jackson field serialization based on another field基于另一个字段的杰克逊字段序列化
【发布时间】:2017-09-28 11:29:24
【问题描述】:

考虑到我有这样的模型:

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
    */
}

我想要的是,“从”字段的序列化值应该是不同的类型,具体取决于“主”字段值。例如,有条件:

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,但如果我在字段级别使用此类序列化程序,似乎无法获取另一个字段的值。 有没有办法在没有样板代码的情况下实现这种行为? 谢谢!

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    您可以通过为 slave 字段声明“智能”getter 来欺骗 Jackson。

    像这样声明 getter:

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

    Jackson 将在运行时根据返回值的确切类型对其进行转换。

    【讨论】:

    • 我对这段代码既高兴又沮丧。我花了大约 4 个小时才找到一个实现,但它是如此接近和如此简单......非常感谢!
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 2021-12-02
    • 2013-07-10
    • 2013-02-23
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多