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

Jackson只序列化接口方法

祝灼光
2023-03-14

我有一个带有一些方法ma、mb、mc的对象A,这个对象实现了一个只有ma和mb的接口B。

当我序列化B时,我希望只有ma和mb作为json响应,但我也得到mc。

我希望自动化这种行为,以便我序列化的所有类都基于接口而不是实现进行序列化。

我该怎么做?

例子:

public interface Interf {
    public boolean isNo();

    public int getCountI();

    public long getLonGuis();
}

实现:

public class Impl implements Interf {

    private final String patata = "Patata";

    private final Integer count = 231321;

    private final Boolean yes = true;

    private final boolean no = false;

    private final int countI = 23;

    private final long lonGuis = 4324523423423423432L;

    public String getPatata() {
        return patata;
    }


    public Integer getCount() {
        return count;
    }


    public Boolean getYes() {
        return yes;
    }


    public boolean isNo() {
        return no;
    }


    public int getCountI() {
        return countI;
    }

    public long getLonGuis() {
        return lonGuis;
    }

}

序列化:

    ObjectMapper mapper = new ObjectMapper();

    Interf interf = new Impl();
    String str = mapper.writeValueAsString(interf);

    System.out.println(str);

回应:

 {
    "patata": "Patata",
    "count": 231321,
    "yes": true,
    "no": false,
    "countI": 23,
    "lonGuis": 4324523423423423500
} 

预期响应:

 {
    "no": false,
    "countI": 23,
    "lonGuis": 4324523423423423500
 } 

共有2个答案

邢曦
2023-03-14

您有两种选择:

1)将@JsonSerialize注释放在你的界面上(参见@broc.seib答案)

2)或使用特定的编写器进行序列化(从Jackson 2.9.6开始):

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writerFor(Interf.class).writeValueAsString(interf);
岳嘉石
2023-03-14

只需注释您的接口,以便Jackson根据接口的类而不是底层对象的类构造数据字段。

@JsonSerialize(as=Interf.class)
public interface Interf {
  public boolean isNo();
  public int getCountI();
  public long getLonGuis();
}
 类似资料:
  • 我有一个带有几个实现类的通用接口,需要通过Json序列化和反序列化这些类。我正试图开始与Jackson合作,使用完整的数据绑定,没有太多运气。 示例代码说明了这个问题: 调用会导致以下异常: 组织。科德豪斯。杰克逊。地图JsonMappingException:未找到类测试$Success的序列化程序,也未找到创建BeanSerializer的属性(为了避免异常,请禁用SerializationC

  • 问题内容: 我需要从redis保存和加载对象。 该对象包含GrantedAuthority列表(除其他外),它是一个接口: Jackson成功地序列化了该对象,但是未能反序列化该对象,但有以下例外: 我知道可以通过添加以下内容来指定类型: 但是在这种情况下我无法做到这一点,因为the 是Spring的接口,我无法更改它。 序列化的json是: } 摘要只能用填充。 所以我尝试了: 仍然没有运气。

  • 问题内容: 我需要从Redis保存和加载对象。 该对象包含GrantedAuthority列表(除其他外),它是一个接口: Jackson成功地序列化了该对象,但未能反序列化,但有以下例外: 我知道我可以通过添加以下内容来指定类型: 但是在这种情况下我无法做到这一点,因为the 是Spring的接口,我无法更改它。 序列化的json是: } 摘要只能用填充。 所以我尝试了: 仍然没有运气。 问题答

  • 我需要从 redis 保存和加载对象。 该对象包含GrantedAuthority列表(以及其他内容),它是一个接口: Jackson 成功序列化了该对象,但未能对其进行反序列化,但有以下异常: 我知道我可以通过添加来指定类型: 但在这种情况下我不能这样做,因为是Spring的一个接口,我不能更改它。 序列化的json是: } 摘要只充满了。 所以我尝试了: 但仍然没有运气。

  • 问题内容: 在使用Jackson(fasterxml.jackson 2.1.1)时,是否有内置的方式仅序列化子的ID?我们要发送一个通过REST的参考文件。但是person对象非常复杂,我们可以在服务器端刷新它,因此我们需要的只是主键。 还是我需要一个定制的序列化器?还是我需要其他所有属性?这样可以防止在请求对象时将数据发送回去吗?我不确定是否需要,但我想尽可能控制它。 问题答案: 有几种方法。

  • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使