首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SubTypes将json反序列化为对象?

如何使用SubTypes将json反序列化为对象?
EN

Stack Overflow用户
提问于 2019-11-18 12:59:22
回答 1查看 842关注 0票数 1

我需要反序列化JSON以使对象依赖于类型。我有以下JSON:

代码语言:javascript
复制
{
   "type": "dog",
   "name": "dogName"
}

我有以下课程:

代码语言:javascript
复制
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "cat"),
})
public abstract class Animal {
    @JsonProperty("type")
    public String type;
    public String name;
}

public class Dog extends Animal {
   ...
}

public class Cat extends Animal {
   ...
}

当我试图反序列化时,一切都很好:

代码语言:javascript
复制
public class StartPdfApp {
    public static void main(String[] args) throws IOException {
        ...
        ObjectMapper mapper = new ObjectMapper();
        Animal animal = mapper.readValue(json, Animal.class);
        System.out.println("TYPE: " + animal.type);        // always null
        System.out.println("DOG: " + (animal instanceof Dog));
        System.out.println("CAT: " + (animal instanceof Cat));
    }
}

但是,当我想获得字段值type时,我有null,如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-18 13:12:15

您需要告诉Jackson将类型字段传递给反序列化器,否则它只用于类型识别。这是通过属性visible@JsonTypeInfo注释中完成的。另外,不确定在您的情况下是否有严格的必要,但我指定要使用现有属性的类型信息:

代码语言:javascript
复制
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "type",
    visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "cat"),
})
public abstract class Animal {
    @JsonProperty("type")
    public String type;
    public String name;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58915120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档