当前位置: 首页 > 知识库问答 >
问题:

忽略Jackson多态类型映射

汪阳辉
2023-03-14

我使用@JsonTypeInfo和@JsonSubTypes来映射基于给定属性的解析子类。下面是我想要解析的示例JSON的一个人为示例。

{ "animals": [
      { "type" : "dog", "name" : "spike" }
     ,{ "type" : "cat", "name" : "fluffy" }
]}

用这个作为课堂

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME
             ,include = JsonTypeInfo.As.PROPERTY
             ,property = "type")  
@JsonSubTypes({  
   @Type(value = Cat.class, name = "cat"),  
   @Type(value = Dog.class, name = "dog") })  
abstract class Animal  {
  public String name;
{ 

class Dog extends Animal  {  }  
class Cat extends Animal  {  } 

但是,当JSON包含我想要忽略的类型时,就会出现问题。例如,如果我有一个新类型的“猪”,我真的不想反序列化为对象:

{ "animals": [
      { "type" : "dog", "name" : "spike" }
     ,{ "type" : "cat", "name" : "fluffy" }
     ,{ "type" : "pig", "name" : "babe" }
]}

并尝试解析它,它会给我这个错误:

无法将类型id猪解析为[简单类型,类动物]的子类型

我如何修复它,这样我就可以只绘制那些“狗”和“猫”类型的动物,而忽略其他所有东西?

共有1个答案

傅星光
2023-03-14

您可以通过设置JsonTypeInfo来避免异常。defaultImpl注释attibute到java。lang.VoidNoClass取决于您使用的Jackson版本。

以下是一个例子:

public class JacksonUnknownType {
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.PROPERTY,
            property = "type", defaultImpl = Void.class)
    @JsonSubTypes({
            @JsonSubTypes.Type(value = Cat.class, name = "cat"),
            @JsonSubTypes.Type(value = Dog.class, name = "dog")})
    public abstract static class Animal {
        public String name;
        @Override
        public String toString() {
            return getClass().getName() + " :: " + name;
        }
    }

    public static class Dog extends Animal {
    }

    public static class Cat extends Animal {
    }

    public static final String JSON = "[\n" +
            "      { \"type\" : \"dog\", \"name\" : \"spike\" }\n" +
            "     ,{ \"type\" : \"cat\", \"name\" : \"fluffy\" }\n" +
            "     ,{ \"type\" : \"pig\", \"name\" : \"babe\" }\n" +
            "]";

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        List<Animal> value = mapper.readValue(JSON, new TypeReference<List<Animal>>() {});
        System.out.println(value);
    }

}

输出:

[stackoverflow.JacksonUnknownType$Dog :: spike, stackoverflow.JacksonUnknownType$Cat :: fluffy, null, null, null]

请注意,结果集合包含3个null项,而不是1个。这可能是杰克逊的一个缺陷,但很容易容忍。

 类似资料:
  • 问题内容: 我有一堂课,里面也有变量。有时我想忽略某些字段,有时在反序列化时不想忽略(也许也在序列化时)。在Jackson怎么办? 问题答案: 对于序列化,“ 过滤属性 ”博客条目应该会有所帮助。反序列化方面的支持较少,因为更常见的是要过滤掉所写的内容。 一种可能的方法是子类化,重写使方法(和/或字段)具有可忽略性的方法,以使用所需的任何逻辑。 如果您举了一个实际应用的例子,这也可能会有所帮助,即

  • 我有以下课程- 我如何通过使用Jackson JSON API动态地排除字段序列化?

  • 我试图使用Jackson注释来重新命名序列化过程中产生的一些json标签。所有注释都编译得很好,当我运行时,除了所有Jackson注释之外,Jackson序列化工作完全被忽略。即使像@jsonignore或@jsonproperty这样的基本命令对json响应也没有影响。构建路径中的库有: 下面是我需要序列化的一个类的代码示例:

  • 这是我的东西 当我得到响应时,我看到 我的看起来像 问题 如何消除中的值?

  • 在Spring MVC中,我需要将空字符串()视为。这是因为我发现,当我编辑一个表单字段(带有Angular的ng-model),该字段最初是,然后将其擦除为空白时,Angular将以空字符串的形式发送该bean属性。如果我不接触这样的null值,它将不会在JSON有效负载中发送,因此被视为null。

  • 问题内容: 我有一些扩展的模型类:它们定义用于包装Map的get和put方法的getter和setter。我正在尝试使用Jackson(带有RESTEasy)序列化这些类的实例,但是Jackson拒绝注意我的getter(使用注释)。而是仅序列化支持映射的键- 值对。我尝试使用禁用所有方法和字段的自动检测功能,但这并没有任何改变。有没有办法防止Jackson序列化Map,还是必须创建不扩展的新模型