我有一个元素结构,它们都实现了“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"
}
答案 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属性到达的值的序列化。