从一组 POJO 中找到 Json 消息的正确实例
Find the correct instance of a Json message from a set of POJO's
我有一个Json字符串,例如
{"TestMessage":"This test is awesome"}
我有一套 POJO,例如
TestMessage、TestOther、TestSomethingElse
我需要的是可以检测 Json 字符串类型的东西,以便我可以使用正确的 Pojo 操作数据。
我可以对 XML 数据执行类似的操作,如下所示
Unmarshaller u = MatchHelper.createMarshaller();
JAXBElement<AbstractMessageType> eventElement = (JAXBElement<AbstractMessageType>)
u.unmarshal(new StringReader(xmlMessage));
if (eventElement.getValue() instanceof TestMessage) {
TestMessage returnRecord = (TestMessage) eventElement.getValue();
return returnRecord;
}else if(eventElement.getValue() instanceof TestOther){
.....
.....
}
我尝试了以下方法,但它不起作用:
JsonNode eventNode = null;
try {
eventNode = this.mapper.readTree(message);
}catch (JsonParseException e){
log.error("Json Parse Exception - {}",e);
}
if(eventNode!= null && eventNode.isPojo()){
POJONode x = (POJONode)eventNode;
if(x.getPojo() instanceof TestMessage){
log.info("This is a Test Message");
TestMessage testMessage = this.mapper.readValue(message, TestMessage.class);
}
}
使用 Jackson 可以利用 @JsonTypeInfo
,它使您能够为不同的类型指定鉴别器。
也许这篇文章也可能对您有所帮助:JacksonPolymorphicDeserialization
回到您的示例并假设您可以控制消息格式,这可能是您的模型:
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = As.PROPERTY, property = "type")
public abstract class AbstractMessage {
}
public class TestMessage extends AbstractMessage {
private String message;
...
}
public class TestOther extends AbstractMessage {
private int other;
...
}
public class TestSomethingElse extends AbstractMessage {
private boolean justSomethingElse;
...
}
忘记提及您最初使用 JAXB 的方法在这种情况下可行,但您可以直接解组为 AbstractMessage
而不是 JAXBElement
,然后处理具体子类型。
我有一个Json字符串,例如
{"TestMessage":"This test is awesome"}
我有一套 POJO,例如
TestMessage、TestOther、TestSomethingElse
我需要的是可以检测 Json 字符串类型的东西,以便我可以使用正确的 Pojo 操作数据。
我可以对 XML 数据执行类似的操作,如下所示
Unmarshaller u = MatchHelper.createMarshaller();
JAXBElement<AbstractMessageType> eventElement = (JAXBElement<AbstractMessageType>)
u.unmarshal(new StringReader(xmlMessage));
if (eventElement.getValue() instanceof TestMessage) {
TestMessage returnRecord = (TestMessage) eventElement.getValue();
return returnRecord;
}else if(eventElement.getValue() instanceof TestOther){
.....
.....
}
我尝试了以下方法,但它不起作用:
JsonNode eventNode = null;
try {
eventNode = this.mapper.readTree(message);
}catch (JsonParseException e){
log.error("Json Parse Exception - {}",e);
}
if(eventNode!= null && eventNode.isPojo()){
POJONode x = (POJONode)eventNode;
if(x.getPojo() instanceof TestMessage){
log.info("This is a Test Message");
TestMessage testMessage = this.mapper.readValue(message, TestMessage.class);
}
}
使用 Jackson 可以利用 @JsonTypeInfo
,它使您能够为不同的类型指定鉴别器。
也许这篇文章也可能对您有所帮助:JacksonPolymorphicDeserialization
回到您的示例并假设您可以控制消息格式,这可能是您的模型:
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = As.PROPERTY, property = "type")
public abstract class AbstractMessage {
}
public class TestMessage extends AbstractMessage {
private String message;
...
}
public class TestOther extends AbstractMessage {
private int other;
...
}
public class TestSomethingElse extends AbstractMessage {
private boolean justSomethingElse;
...
}
忘记提及您最初使用 JAXB 的方法在这种情况下可行,但您可以直接解组为 AbstractMessage
而不是 JAXBElement
,然后处理具体子类型。