Java 如何使用Jackson的JsonTypeInfo和JsonSubType注释?

Java 如何使用Jackson的JsonTypeInfo和JsonSubType注释?,java,json,annotations,jackson,deserialization,Java,Json,Annotations,Jackson,Deserialization,TL,DR我应该在注释上使用什么参数?跳到第三部分 我一直在和不太好的文档做斗争,即关于反序列化。正因为如此,我很抱歉写了这么长的文章,我有一些实现细节,我必须自己用注释来解决,还有一个约束条件是不能构建 注意:Jackson版本是一个2.X的FasterXML 直截了当地说,我有不同的JSON请求,我必须解释第1部分,并将它们与第2部分的数据模型相匹配。我知道我可以使用@JsonTypeInfo和@JsonSubType注释,但我在试图理解它时遇到了困难,这就是为什么我要向您提供一个完整的示例

TL,DR我应该在注释上使用什么参数?跳到第三部分

我一直在和不太好的文档做斗争,即关于反序列化。正因为如此,我很抱歉写了这么长的文章,我有一些实现细节,我必须自己用注释来解决,还有一个约束条件是不能构建

注意:Jackson版本是一个2.X的FasterXML

直截了当地说,我有不同的JSON请求,我必须解释第1部分,并将它们与第2部分的数据模型相匹配。我知道我可以使用@JsonTypeInfo和@JsonSubType注释,但我在试图理解它时遇到了困难,这就是为什么我要向您提供一个完整的示例

1.要反序列化的JSON 我想发布这三个不同的对象:

{ "animal" : {
  "dog" : {
    "name" : "Rex",
    "owner" : "Mike",
    "breed" : {
      "lab" : {
        "color" : "YELLOW",
        "family" : {
          "id" : null,
          "shortName" : "GL of NE",
          "longName" : "Great Labs of New England"
        }
      }
    }
  }}

2.Java数据模型 然后我们有了这个模型,我想将JSON与之匹配

    abstract class Animal {
        private String _specie;
        // usual getters and setters...
     }

     class Bird extends Animal {
        private Color _color;

        public Bird(Color color) {
            super();
            this._color = color;
         }
         // + usual getters and setters...
     }

     class Dog extends Animal {
        private String _name;
        private String _owner;
        private Breed _breed;

        public Dog(String dogName, String dogOwner, Breed dogBreed) {
            super();
            this._name = dogName;
            this._owner = dogOwner;
            this._breed = dogBreed;
        }
        // + usual getters and setters...
    }

    abstract class Breed {
        private String _breedName;
        // usual getters and setters...
    }

    class Lab extends Breed {
        private Color _color;
        private Family _family;

        public Lab(Color color, Family family) {
            super();
            this._color = color;
            this._family = family;
         }
        // + usual getters and setters...
    }

    class GoldenRetriever extends Breed {
        private Integer _lifeSpan;

        public GoldenRetriever(Integer lifeSpan) {
            super();
            this._lifeSpan = lifeSpan;
         }
        // + usual getters and setters...
    }

    class Family {
        private String _id;
        private String _longFamilyName;
        private String _shortFamilyName;
         // usual getters and setters...
     }

     enum Color {
        BLUE("BLUE"),
        YELLOW("YELLOW"):
        private final _colorName:
        public colorName() {
            return this._colorName;
         }
    }
3.如何处理注释 这里的主要问题是,

在@JsonTypeInfo上,我应该使用哪些参数来解释某些内容

{ ... {"dog": ... "breed" : { "lab" : { ... }}}}        
使用实验室作为包装?。还是应该在@JsonSubType上

我应该如何声明Color类的注释,以便只能与Color:BLUE匹配

我应该在何时何地使用@JsonCreator和@JsonProperty注释

@JsonTypeInfo上的use、include和property是什么意思?示例@JsonTypeInfouse=JsonTypeInfo.Id.CLASS,include=As.PROPERTY,PROPERTY=@CLASS以及它们如何影响JSON反序列化


谢谢大家!

你有没有想过?因为我有一个类似的问题;似乎是一个相当普遍的问题problem@user26270字体首先我找到了这篇文章。然后我决定在主类的顶部使用以下注释:@JsonTypeInfouse=Id.class,include=As.PROPERTY,PROPERTY=family@JsonSubTypesvalue={@Typevalue=acoccretesubclass.class,@Typevalue=OtherConcreteSubClass.class}希望有帮助;
    abstract class Animal {
        private String _specie;
        // usual getters and setters...
     }

     class Bird extends Animal {
        private Color _color;

        public Bird(Color color) {
            super();
            this._color = color;
         }
         // + usual getters and setters...
     }

     class Dog extends Animal {
        private String _name;
        private String _owner;
        private Breed _breed;

        public Dog(String dogName, String dogOwner, Breed dogBreed) {
            super();
            this._name = dogName;
            this._owner = dogOwner;
            this._breed = dogBreed;
        }
        // + usual getters and setters...
    }

    abstract class Breed {
        private String _breedName;
        // usual getters and setters...
    }

    class Lab extends Breed {
        private Color _color;
        private Family _family;

        public Lab(Color color, Family family) {
            super();
            this._color = color;
            this._family = family;
         }
        // + usual getters and setters...
    }

    class GoldenRetriever extends Breed {
        private Integer _lifeSpan;

        public GoldenRetriever(Integer lifeSpan) {
            super();
            this._lifeSpan = lifeSpan;
         }
        // + usual getters and setters...
    }

    class Family {
        private String _id;
        private String _longFamilyName;
        private String _shortFamilyName;
         // usual getters and setters...
     }

     enum Color {
        BLUE("BLUE"),
        YELLOW("YELLOW"):
        private final _colorName:
        public colorName() {
            return this._colorName;
         }
    }
{ ... {"dog": ... "breed" : { "lab" : { ... }}}}