为根节点以外的所有注册Jackson Serializer

时间:2015-05-30 08:59:18

标签: java jackson dropwizard

我有一个元素结构,它们都实现了“Urifyable”接口。假设我们有火车和当前的车站。

public class Train implements Urifyable {
    @JsonProperty
    public String getName() {
        return "My Train";
    }
    @JsonProperty
    public Station getCurrentStation() {
        return StationPool.get("1");
    }
    public String getUri() {
        return "/train/1";
    }
}

public class Station implements Urifyable {
    @JsonProperty
    public String getName() {
        return "My Station";
    }
    @JsonProperty
    public Train[] getCurrentTrains() {
        return /* some code to get an array of trains */;
    }
    public String getUri() {
        return "/station/1";
    }
}

如果我使用dropwizard + jason + jax-rs,我可以注册这样的自定义序列化器:

final SimpleModule myModule = new SimpleModule("MyModule");
myModule.addKeySerializer(Urifyable.class, new UrifyableSerializer());
environment.getObjectMapper().registerModule(myModule);

UrifyableSerializer确实阻止了jackson的通用序列化逻辑,只返回getUri方法的字符串表示。

如何仅为除根节点之外的所有内容启用此序列化程序?因为此刻它将返回

"/station/1"

如果我要求一个电台,但它应该返回:

{
   "name": "My Station",
   "currentTrains": [
       "/train/1", 
       "/train/2",
       "/train/3",
   ]
}

和“/ train / 1”它应该返回:

{
    "name": "My Train",
    "currentStation": "/station/1"
}

1 个答案:

答案 0 :(得分:0)

一种可能性是指定用于属性的序列化程序,而不是类型。也就是说,不是通过模块注册,而是声明它:

public class Station implements Urifyable {
  // note: since it's array, use 'contentUsing'; for POJOs it'd be 'using'
  @JsonSerialize(contentUsing=MyTrainSerializer.class)
  public Train[] getCurrentTrains() {
     return /* some code to get an array of trains */;
  }
}

这种方式序列化程序仅适用于通过特定POJO属性到达的值的序列化。