序列化/反序列化带有Jackson的额外信息的不可变对象

时间:2016-02-17 16:04:58

标签: java json jackson immutability

我尝试在我的应用程序中仅使用不可变对象。我有一个REST服务,它将任意JSon对象作为输入。

我有一个映射这些对象的Java类,我想让它们不可变+能够处理额外的参数(就像使用@JsonAnySetter)。

这是我的java类:

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....
}

但这不再是一成不变的了!

这不起作用,因为杰克逊没有找到任何“额外”的json属性来阅读。我希望将无法映射的所有内容添加到我的地图中。

知道如何做到这一点? (或者只是可能:)

注意:我使用带有-parameters选项的javac和来自jackson的ParameterNameModule,以便我不需要@JsonCreator选项。

1 个答案:

答案 0 :(得分:1)

好的,我回复自己:)

似乎只使用杰克逊这样做是不可能的。

因为我想要不变性,所以我已经把自己转向了不可变的&#39;框架: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();
}

有关详细信息,请参阅immutables文档。