使用 Jackson 反序列化为 Map<java.lang.String, java.net.URI>

Deserializing into Map<java.lang.String, java.net.URI> with Jackson

我有这个 JSON 片段:

{
"uploadData": {
    "25967391": {
        "jobid": "jobId",
        "numberOfFiles": "1",
        "outputFiles": {
            "1": "file.pdf"
        },
        "originalFiles": {
            "1": "./target/test-classes/com/tools/myProject/input/File.pdf",
            "2": "./target/test-classes/com/tools/myProject/input/File.csv"
        }
    }
  }
}

我想做的是将 "originalFiles" 反序列化为 Map。因为 "originalFiles" 中的“1”和“2”都是非绝对 URI,所以我已经有一个自定义的 class URIStringDeserializer

Paths.get(".").toUri().resolve(uriString).normalize().toASCIIString()

这给了我

file:/C:/Users/userName/IdeaProjects/myProject/target/test-classes/com/tools/myProject/input/File.pdf

用于 originalFiles 的第一个 uri。 这是 class 和 uploadData 字段:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UploadData{

 @JsonProperty("originalFiles")
 private Map<Integer, URI> originalFiles;

 //getters and setters omitted
}

@JsonDeserialize(using = CustomDeserializer.class) 注释 uploadData 字段会导致 com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.net.URI out of START_OBJECT token。如何让我的自定义反序列化器与 tose 映射一起工作?

经过一些外部帮助,找到了解决方案。添加

@JsonDeserializer(contentUsing = CustomDeserializer.class)

已经完成了我想要的。