Serialize/deserialize 带有 Jackson 额外信息的不可变对象
Serialize/deserialize immutable objects that carry extra informations with Jackson
我尝试在我的应用程序中只使用不可变对象。我有一个 REST 服务,它将任意 JSon 对象作为输入。
我有一个映射这些对象的 Java class,我想让它们不可变 + 能够处理额外的参数(就像使用 @JsonAnySetter
一样)。
这是我的 java class:
public class Operation {
private final String _id;
private final String state;
private final Map<String, Object> extra;
public Operation(String _id, String state, Map<String,Object> extra) {
this._id = _id;
this.state = state;
this.extra = extra;
}
// getters....
}
使用 @JsonAnySetter
我会:
public class Operation {
private final String _id;
private final String state;
private Map<String, Object> extra = new HashMap<>();
public Operation(String _id, String state) {
this._id = _id;
this.state = state;
}
@JsonAnySetter
public void addExtra(String key, Object value) {
this.extra.put(key,value);
}
// getters....
}
但这不再是一成不变的了!
这将不起作用,因为 Jackson 没有找到任何 "extra" json 属性来读取。我希望所有无法映射的内容都添加到我的地图中。
知道怎么做吗? (或者只是可能:)
注意:我使用带有 -parameters 选项的 javac 和来自 jackson 的 ParameterNameModule
,这样我就不需要 @JsonCreator
选项。
好的,我自己回复:)
似乎仅使用 Jackson 是不可能做到这一点的。
因为我想要不变性,所以我转向了“immutables”框架:http://immutables.github.io/
通过一些配置,它将处理额外的参数,如以下报告所述:https://github.com/immutables/immutables/issues/185。
在我的情况下,我有以下代码:
@Value.Immutable
@JsonSerialize(as = ImmutableOperation.class)
@JsonDeserialize(as = ImmutableOperation.class)
public abstract class Operation {
@JsonAnyGetter
@Value.Parameter
public abstract Map<String, String> extra();
}
有关详细信息,请参阅不可变文档。
我尝试在我的应用程序中只使用不可变对象。我有一个 REST 服务,它将任意 JSon 对象作为输入。
我有一个映射这些对象的 Java class,我想让它们不可变 + 能够处理额外的参数(就像使用 @JsonAnySetter
一样)。
这是我的 java class:
public class Operation {
private final String _id;
private final String state;
private final Map<String, Object> extra;
public Operation(String _id, String state, Map<String,Object> extra) {
this._id = _id;
this.state = state;
this.extra = extra;
}
// getters....
}
使用 @JsonAnySetter
我会:
public class Operation {
private final String _id;
private final String state;
private Map<String, Object> extra = new HashMap<>();
public Operation(String _id, String state) {
this._id = _id;
this.state = state;
}
@JsonAnySetter
public void addExtra(String key, Object value) {
this.extra.put(key,value);
}
// getters....
}
但这不再是一成不变的了!
这将不起作用,因为 Jackson 没有找到任何 "extra" json 属性来读取。我希望所有无法映射的内容都添加到我的地图中。
知道怎么做吗? (或者只是可能:)
注意:我使用带有 -parameters 选项的 javac 和来自 jackson 的 ParameterNameModule
,这样我就不需要 @JsonCreator
选项。
好的,我自己回复:)
似乎仅使用 Jackson 是不可能做到这一点的。
因为我想要不变性,所以我转向了“immutables”框架:http://immutables.github.io/
通过一些配置,它将处理额外的参数,如以下报告所述:https://github.com/immutables/immutables/issues/185。
在我的情况下,我有以下代码:
@Value.Immutable
@JsonSerialize(as = ImmutableOperation.class)
@JsonDeserialize(as = ImmutableOperation.class)
public abstract class Operation {
@JsonAnyGetter
@Value.Parameter
public abstract Map<String, String> extra();
}
有关详细信息,请参阅不可变文档。