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