当前位置: 首页 > 知识库问答 >
问题:

SpringMVC杰克逊。在bean序列化期间添加字段

慕容坚
2023-03-14

杰克逊v1。9.13 spring 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参数构造函数或一些非/错误记录的方法。

非常令人沮丧。

有人知道如何实现上述目标吗?

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

多谢了。

N

共有1个答案

申黎明
2023-03-14

您可以为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;
    }
}
 类似资料:
  • 问题内容: 我有以下课程- 我正在使用objectMapper.valueToTree(sections)将其转换为JsonNode。但是,当我打印相同的内容时,我仅从Entity类中看到id和name字段,而从Images列表中看不到任何内容。我是否需要添加任何种类的特殊逻辑或注释以确保同时打印列表。 以下是主要课程- 问题答案: 您需要为Entity#images添加getter和setter

  • 我对jackson进行了配置,以便在和时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。 但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常: 很抱歉没有提到我在单元测试中。 TestClass:

  • 有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。

  • 问题内容: 我需要设置班级日期序列化的格式。我有Jackson的版本,没有@JsonFormat。这就是为什么我编写自定义类的原因: } 并使用它: 但是,我还有另一个具有不同日期格式的字段,并且我不想创建用于序列化的其他类。我可以将所有需要的格式(例如常量)添加到CDJsonDateSerializer类中,并通过注释设置所需的格式吗?像这样: 。 下面的答案后: 经过一些更正后,它可以工作。我

  • 我正在构建一个REST网络服务。某些类的属性类型为(JodaTime)。 将此对象发送给我的客户端(Javascript)时,我的对象 被转化为 问题是我把这个对象发回服务器时出错了,因为我无法实例化 我想有像-任何其他格式都可以。 环境 杰克逊-注释2.8.8 jackson-core 2.8.8 杰克逊-数据库2.8.8 jackson-datatype-joda 2.8.8 joda-tim

  • Java Jackson能否将一个json字符串date反序列化成Java Long字段(从epoch开始的毫秒数)? 这是一个要反序列化的json字段的示例: 这是Java类中的同一字段,带有当前注释: 但是,发生异常: com . faster XML . Jackson . databind . exc . invalidformatexception:无法从字符串“2022-01-02T0