0

我有一个 JsonString,例如

{"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);
  }
}
4

1 回答 1

1

使用 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然后处理具体的子类型。

于 2017-09-29T09:13:51.813 回答