Spring-MVC杰克逊。在bean序列化期间添加字段

时间:2013-07-26 12:01:18

标签: json serialization jackson custom-fields

jackson v1.9.13 春天3.2.0 嗨, 我花了好几天时间试图弄清楚如何在序列化过程中从bean中添加一个JSON字段。

这似乎是一个非常基本的功能,但我在每条路线上撞到了橡胶墙。

我想要实现的目标:

示例bean:

package org.mydomain;

public class MyBean implements Serializable {
    private String foo;
    public void setFoo( String inValue ) {
        foo = inValue;
    }    
    public String getFoo() {
        return foo;
    }
}

输出:

{
    "_type" : "org.mydomain.MyBean",
    "foo" : "bar"
}

我认为简单的方法是扩展BeanSerializer编写“_type”属性并委托其余字段的超类序列化。问题是,方法的可访问性和一些关键方法的“最终”条款使它成为一个泥潭。

我尝试扩展BeanSerializerBase,JsonSerializer,BeanSerializerModifier。

每次我遇到一些难以理解的24个参数构造函数或某些非/错误记录的方法。

非常令人沮丧。

任何人都知道如何实现上述目标?

我正在使用spring-mvc,因此我需要通过ObjectMapper配置的可插拔解决方案。我不想用json特定的注释或序列化逻辑来污染我的模型或控制器对象。

非常感谢。

<磷>氮

1 个答案:

答案 0 :(得分:-1)

您可以为MyBean创建代理类,并使用它代替MyBean。这不需要更改原始类。您只需要用代理对象替换原始MyBean对象。虽然您可以在不需要MyBean的界面的情况下使用,但使用界面更清晰。

package org.mydomain;
public interface IMyBean{
    public String getFoo();
}
public class MyBean implements IMyBean,Serializable {
    private String foo;
    public void setFoo( String inValue ) {
        foo = inValue;
    }    
    public String getFoo() {
        return foo;
    }
}
public class MyBeanProxy implements IMyBean,Serializable {

    private IMyBean myBean;
    private String type;
    public MyBeanProxy(IMyBean myBean, String type){
        this.myBean = myBean;
        this.type = type;
    }

    public String getFoo() {
        return myBean.getFoo();
    }
    public String getType(){
        return type;
    }
}