【问题标题】:Jackson serialize only interface methodsJackson 仅序列化接口方法
【发布时间】:2013-09-06 09:21:47
【问题描述】:

我有一个对象 A 有一些方法 ma, mb, mc 并且这个对象实现了一个接口B 只有 mamb

当我序列化 B 时,我只希望 mamb 作为 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
 } 

【问题讨论】:

标签: java json serialization jackson


【解决方案1】:

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

@JsonSerialize(as=Interf.class)
public interface Interf {
  public boolean isNo();
  public int getCountI();
  public long getLonGuis();
}

【讨论】:

  • 如果我的 impl 类有多个接口,我想按照接口中定义的 getter 序列化对象。
  • 我想从不同的服务返回不同的接口。
  • @varun 您可能应该设置不同的端点以返回不同的数据结构。即getFoo()返回Foo接口,getBar()返回Bar接口,其中Foo和Bar具有相同的底层impl类。
  • 那不行,Jackson 总是序列化底层实现,不管是什么接口。
  • @varun 我可以让 Jackson 返回一个与一个接口匹配的结构,但我对每个两个接口返回两个不同的数据结构是不正确的。我用@JsonSerialize 注释interface 的答案恰好起作用,因为Jackson 在接口列表中查找适用的注释。它适用于 OP,但并没有像我想象的那样做。
【解决方案2】:

你有两个选择:

1) 在你的界面上添加@JsonSerialize注解(见@broc.seib answer

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

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writerFor(Interf.class).writeValueAsString(interf);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2023-04-07
    相关资源
    最近更新 更多