【问题标题】:Java unmarshilling JSON data containg abstract typeJava 解组包含抽象类型的 JSON 数据
【发布时间】:2013-05-28 20:28:11
【问题描述】:

我们正在使用 Jersey/Jackson 将 JSON 数据解组到 java DTO。我的 DTO 之一是一个抽象类,我想将 JSON 数据解组到他的扩展 DTO 之一。例如,假设我有这些 DTO:

public abstract class AnimalDTO{}

public class DogDTO extends AnimalDTO{}

public class CatDTO extends AnimalDTO{}

我想解组这个 JSON 数据:

{Zoo: {Animals:[{"type"="DogDTO", "code"="001", "name"="chihuahua"}, {"type"="CatDTO", "code"="002", "name"="felix"}]}}

因为“类型”会给出我想要解组的 DTO 的类型。但似乎没有考虑这个属性。 JSON 语法中是否有我遗漏或错误的地方?

谢谢。

【问题讨论】:

  • 您的 JSON 无效。而不是 Zoo and Animals 你应该有“Zoo”和“Animals”。在 JSON 中,我们有“propertyName”:“propertyValue”而不是“propertyName”=“propertyValue”。 en.wikipedia.org/wiki/JSON真的是这个样子吗?

标签: json jersey jackson abstract-class


【解决方案1】:

在您的情况下,您应该使用 @JsonTypeInfo 注释。

更多信息,请查看以下链接:

使用上面的链接,我创建了一个简单的例子,它用类名序列化 POJO 对象:

import java.io.StringWriter;
import java.util.Arrays;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        DogDTO dog = new DogDTO();
        dog.setCode("001");
        dog.setName("chihuahua");

        CatDTO cat = new CatDTO();
        cat.setCode("002");
        cat.setName("felix");

        Zoo zoo = new Zoo();
        zoo.setAnimals(new AnimalDTO[] { dog, cat });

        Data data = new Data();
        data.setZoo(zoo);

        ObjectMapper objectMapper = new ObjectMapper();

        StringWriter writer = new StringWriter();
        objectMapper.writeValue(writer, data);
        System.out.println(writer);
    }
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
abstract class AnimalDTO {

    private String code;
    private String name;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "AnimalDTO [code=" + code + ", name=" + name + "]";
    }
}

class DogDTO extends AnimalDTO {
}

class CatDTO extends AnimalDTO {
}

class Zoo {

    @JsonProperty(value = "Animals")
    private AnimalDTO[] animals;

    public AnimalDTO[] getAnimals() {
        return animals;
    }

    public void setAnimals(AnimalDTO[] animals) {
        this.animals = animals;
    }

    @Override
    public String toString() {
        return "Zoo [animals=" + Arrays.toString(animals) + "]";
    }
}

class Data {

    @JsonProperty(value = "Zoo")
    private Zoo zoo;

    public Zoo getZoo() {
        return zoo;
    }

    public void setZoo(Zoo zoo) {
        this.zoo = zoo;
    }

    @Override
    public String toString() {
        return "Data [zoo=" + zoo + "]";
    }
}

这个程序打印:

{"Zoo":{"Animals":[{"type":"DogDTO","code":"001","name":"chihuahua"},{"type":"CatDTO","code":"002","name":"felix"}]}}

【讨论】:

  • @GhostCat,我会尽我所能提供帮助,并鼓励其他人使用这些出色的工具,例如 JacksonGson,并使 JSON 对其他人更简单。我同意,它看起来像小众,但不是故意的——我只是没有太多时间来处理其他标签;)
猜你喜欢
  • 2019-03-12
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2012-10-08
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多