Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 - Fatal编程技术网

Java 映射中的Jackson多态反序列化

Java 映射中的Jackson多态反序列化,java,json,jackson,Java,Json,Jackson,在前面的例子中,我使用了Jackson(Jackson 1.9,由Codehaus托管)多态序列化将格式列表List序列化为适当的对象类型 现在,我需要序列化一个Map并反序列化它。我看到当值被写入时,我得到了我期望的正确格式: {“className”:“IndexRecord”,“id”:0,“fields”:{“className”:“FieldMap”,“df12”:{“className”:“CustomStringType”,“value”:“ralph”}} 在这里,我尝试了一些东

在前面的例子中,我使用了Jackson(Jackson 1.9,由Codehaus托管)多态序列化将格式列表
List
序列化为适当的对象类型

现在,我需要序列化一个
Map
并反序列化它。我看到当值被写入时,我得到了我期望的正确格式:

{“className”:“IndexRecord”,“id”:0,“fields”:{“className”:“FieldMap”,“df12”:{“className”:“CustomStringType”,“value”:“ralph”}}

在这里,我尝试了一些东西,包括map的包装器实现(
FieldMap
)。每当我尝试反序列化它时,我都会

无法将类型id“CustomStringType”解析为“MyBaseType”的子类型。

我确实对所有内容进行了正确的注释,包括
JsonTypeInfo
JsonSubType

这里有一个非常简单的例子来实现它。假设你有这些POJO

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className")
@JsonIgnoreProperties(ignoreUnknown = true)
public class IndexRecord {
    private int id;
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className")
    private Map<String,IndexValue> fields;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeName("IndexValue")
public class IndexValue {
    private String value;
}

根据一些文档,我可能需要实现一个自定义反序列化程序。

请提供一个可复制的示例。您可以升级到Jackson 2吗?这个版本的库对我有用。我可以尝试升级。我还不想重做我所有的注释。对于任何遇到此问题的人,都可以通过实现自定义反序列化程序来修复此问题?
IndexRecord indexRecord = new IndexRecord();
IndexValue iv = new IndexValue();
iv.setValue("ralph");
indexRecord.getFields().put("foo",iv);
ObjectMapper om = new ObjectMapper();
String data = om.writeValueAsString(indexRecord);
System.out.println("Data is "+data);
IndexRecord result = om.readValue(data,IndexRecord.class);