Java 从json反序列化org.springframework.data.util.pair

Java 从json反序列化org.springframework.data.util.pair,java,json,spring,spring-boot,jackson,Java,Json,Spring,Spring Boot,Jackson,我应该能够将org.springframework.data.util.pair序列化/反序列化为JSON/来自JSON 我有列表myPairList-我喜欢存储/加载此列表 序列化没有问题;但是,由于此对是不可变的,因此没有默认构造函数,反序列化失败。 我知道有@JsonCreator;但是,如果我正确,我们只能将其放置在构造函数上。由于pair类是final,因此我无法使用自己的默认构造函数扩展它,该构造函数使用@JsonCreator 有人能指出我该如何实现我的目标吗?我希望避免创建自己的

我应该能够将
org.springframework.data.util.pair
序列化/反序列化为JSON/来自JSON

我有
列表myPairList
-我喜欢存储/加载此列表

序列化没有问题;但是,由于此
对是不可变的,因此没有默认构造函数,反序列化失败。
我知道有
@JsonCreator
;但是,如果我正确,我们只能将其放置在构造函数上。由于
pair
类是final,因此我无法使用自己的默认构造函数扩展它,该构造函数使用
@JsonCreator


有人能指出我该如何实现我的目标吗?我希望避免创建自己的包装器类。

我认为您需要为该属性实现一个自定义反序列化程序,如下面的答案所示。您可以将
@JsonDeserialize
注释放在属性上方。

markusw的答案是正确的。为了展示一个真实的示例,下面是我最终如何解决它以反序列化一组对:

public class MyPairDeserializer extends JsonDeserializer<Pair<MyClassA, MyClassB>> {

  static private ObjectMapper objectMapper = null;

  @Override
  public Pair<MyClassA, MyClassB> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    if (objectMapper == null) {
      objectMapper = new ObjectMapper();
      objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
    JsonNode treeNode = jsonParser.getCodec().readTree(jsonParser);
    MyClassA first = objectMapper.treeToValue(treeNode.get("first"), MyClassA.class);
    MyClassB second = objectMapper.treeToValue(treeNode.get("second"), MyClassB.class);
    return Pair.of(first, second);
  }

}

...
SimpleModule module = new SimpleModule();
module.addDeserializer(Pair.class, new MyPairDeserializer());
objectMapper.registerModule(module);
List<Pair<MyClassA, MyClassB>> myData = objectMapper.readValue(file..., new TypeReference<List<Pair<Class<MyClassA>, Class<MyClassB>>>>() {
...
公共类MyPairDeserializer扩展JsonDeserializer{
静态私有ObjectMapper ObjectMapper=null;
@凌驾
公共对反序列化(JsonParser、JsonParser、DeserializationContext、DeserializationContext)抛出IOException、JsonProcessingException{
if(objectMapper==null){
objectMapper=新的objectMapper();
objectMapper.configure(在未知属性上反序列化feature.FAIL,false);
}
JsonNode treeNode=jsonParser.getCodec().readTree(jsonParser);
MyClassA first=objectMapper.treeToValue(treeNode.get(“first”),MyClassA.class);
MyClassB second=objectMapper.treeToValue(treeNode.get(“second”),MyClassB.class);
返回对(第一,第二);
}
}
...
SimpleModule=新的SimpleModule();
addDeserializer(Pair.class,新的MyPairDeserializer());
objectMapper.registerModule(模块);
List myData=objectMapper.readValue(文件…,新类型引用(){
...

请注意反序列化程序中嵌入的
ObjectMapper
。它用于反序列化“第一个”和“第二个”

我认为您需要为该属性实现自定义反序列化器:我编辑问题是为了指出,
不在另一个要序列化/反序列化的POJO中。因此,我应该将
@JsonDeserialize
放置在何处/如何放置?好的,我可以将反序列化器添加到ObjectMapper中。但我需要了解如何将其添加到ObjectMapper中正确检索字段。。。