【问题标题】:Spring-MVC Jackson. Add field during bean serializationSpring-MVC 杰克逊。在 bean 序列化期间添加字段
【发布时间】:2013-07-26 16:34:17
【问题描述】:

杰克逊 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 特定的注释或序列化逻辑污染我的模型或控制器对象。

非常感谢。

N.

【问题讨论】:

标签: json serialization jackson custom-fields


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 2012-09-10
    • 1970-01-01
    • 2012-11-07
    • 2021-12-02
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多