将Json转换为包含类型变量(某些子类)的Java对象
我想将JSON映射到POJO。JSON格式为:将Json转换为包含类型变量(某些子类)的Java对象,java,json,jackson,Java,Json,Jackson,我想将JSON映射到POJO。JSON格式为: { user: "123abc", messages: [ {"type":"A", "args": {"a":"str", "b":0} }, {"type":"B", "args": {"c":true, "d":false} }, ... ] } 每种类型的消息都有自己的预期参数。例如: class TypeAMessage extends Message {
{
user: "123abc",
messages: [
{"type":"A", "args": {"a":"str", "b":0} },
{"type":"B", "args": {"c":true, "d":false} },
...
]
}
每种类型的消息都有自己的预期参数。例如:
class TypeAMessage extends Message {
String a;
int b;
}
class TypeBMessage extends Message {
boolean c;
boolean d;
}
我可以将此JSON映射到一个简单的POJO,如:
class Messages {
@JsonProperty("user")
String user;
@JsonProperty("messageList")
List<Message> messageList;
class Message {
@JsonProperty("type")
String type;
@JsonProperty("args")
Map<String, Object> args;
}
}
我使用的是Jackson JSON,JSON到对象的转换失败,出现了无法识别的字段“a”(以及b、c、d),因为这些字段不在父消息类中
我走错方向了吗?或者有没有一种方法可以通过告诉JSON对象映射器查找要映射到的子对象来包含每个消息子对象?尝试将内部类设置为静态
static class TypeAMessage extends Message {
@JsonProperty("a")
String a;
@JsonProperty("b")
int b;
}
static class TypeBMessage extends Message {
@JsonProperty("c")
boolean c;
@JsonProperty("d")
boolean d;
}
解决方案是在Message
上添加一些注释,以便JSON反序列化器知道要使用Message
的哪个子类:
class Messages {
@JsonProperty("user")
String user;
@JsonProperty("messageList")
List<Message> messageList;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY,
property="type")
@JsonSubTypes( {
@JsonSubTypes.Type(value=TypeAMessage.class, name="typeA"),
@JsonSubTypes.Type(value=TypeBMessage.class, name="typeB")
})
static class Message {}
static class TypeAMessage extends Message {
@JsonProperty("a")
String a;
@JsonProperty("b")
int b;
}
static class TypeBMessage extends Message {
@JsonProperty("c")
boolean c;
@JsonProperty("d")
boolean d;
}
}
@mlk的可能副本谢谢链接。我翻遍了链接内容(以及链接的内容)并找到了解决方案。解决方案只需在问题上写上几行,似乎比链接中的问题更简单。所以我认为让这个问题保持开放并自己回答是有帮助的。如果你不反对,我会坚持到底。谢谢,尽管这并不能解决问题。请参考我发布的答案。
class Messages {
@JsonProperty("user")
String user;
@JsonProperty("messageList")
List<Message> messageList;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY,
property="type")
@JsonSubTypes( {
@JsonSubTypes.Type(value=TypeAMessage.class, name="typeA"),
@JsonSubTypes.Type(value=TypeBMessage.class, name="typeB")
})
static class Message {}
static class TypeAMessage extends Message {
@JsonProperty("a")
String a;
@JsonProperty("b")
int b;
}
static class TypeBMessage extends Message {
@JsonProperty("c")
boolean c;
@JsonProperty("d")
boolean d;
}
}
{
"user":"someUser",
"messageList":[
{"type":"typeA", "a":"someStr", "b":123},
{"type":"typeB", "c":false, "d":true}
]
}