Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson序列化/反序列化携带额外信息的不可变对象_Java_Json_Jackson_Immutability - Fatal编程技术网

Java 使用Jackson序列化/反序列化携带额外信息的不可变对象

Java 使用Jackson序列化/反序列化携带额外信息的不可变对象,java,json,jackson,immutability,Java,Json,Jackson,Immutability,我尝试在我的应用程序中只使用不可变的对象。我有一个REST服务,它将任意JSon对象作为输入 我有一个映射这些对象的Java类,我想使它们不可变,并且能够处理额外的参数(就像使用@JsonAnySetter) 这是我的java类: 但这不再是一成不变的 这将不起作用,因为Jackson找不到任何要读取的“额外”json属性。我希望所有无法映射的内容都添加到我的地图中 你知道怎么做吗?(或者只是可能:) 注意:我使用javac with-parameters选项和jackson提供的Parame

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

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

这是我的java类:

但这不再是一成不变的

这将不起作用,因为Jackson找不到任何要读取的“额外”json属性。我希望所有无法映射的内容都添加到我的地图中

你知道怎么做吗?(或者只是可能:)


注意:我使用javac with-parameters选项和jackson提供的
ParameterNameModule
,这样我就不需要
@JsonCreator
选项了。

好吧,我回答自己:)

似乎仅仅用杰克逊是不可能做到这一点的

因为我想要不变性,所以我转向了“不变性””框架:

通过少量配置,它将处理以下报告中所述的额外参数:

在我的情况下,我有以下代码:

@Value.Immutable
@JsonSerialize(as = ImmutableOperation.class)
@JsonDeserialize(as = ImmutableOperation.class)
public abstract class Operation {    

  @JsonAnyGetter
  @Value.Parameter
  public abstract Map<String, String> extra();
}
@Value.Immutable
@JsonSerialize(as=ImmutableOperation.class)
@JsonDeserialize(as=ImmutableOperation.class)
公共抽象类操作{
@JsonAnyGetter
@参数值
公共抽象映射额外();
}
有关详细信息,请参阅不可变的文档

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....
}
@Value.Immutable
@JsonSerialize(as = ImmutableOperation.class)
@JsonDeserialize(as = ImmutableOperation.class)
public abstract class Operation {    

  @JsonAnyGetter
  @Value.Parameter
  public abstract Map<String, String> extra();
}