我有一个将接收不同JSON格式的ServerEndpoint。由于每个消息类型只允许有一个消息处理程序,因此我的一个解码器必须将消息转换为相应的Java对象。
在我的解码器中,我试图使用ObjectMapper类将收到的消息转换为SubClassA或SubClassB(实现相同的接口)。ObjectMapper类有一个readValue方法,该方法需要我试图将json映射到的类型,并且当它无法转换为指定类型时将抛出异常。
我目前像下面这样解码它,但它不是很优雅。
@Override
public Message decode(String message) throws DecodeException {
ObjectMapper mapper = new ObjectMapper();
try {
SubclassA obj = mapper.readValue(message, SubclassA .class);
return obj;
} catch (IOException e) {
}
try {
SubclassB obj = mapper.readValue(message, SubclassB .class);
return obj;
} catch (IOException e) {
}
throw new DecodeException(message, "Failed to decode message.");
}
使用ObjectMapper将JSON字符串解码为相应Java对象的最佳方法是什么?
使用Jackson,您可以为父对象声明子类型。你的Json将包含@type与子类型的名称,看看这篇文章用Jackson将JSON反序列化成多态类型——一个完整的例子给了我一个编译错误
Jackson是在Java中使用JSON的最佳选择之一。
对于多态反序列化,考虑以下几点:
- 使用
@JsonTypeInfo
注释 - 对于不适合
@JsonTypeInfo
标注的情况,可以考虑使用StdDeserializer
标注。这个答案会对你有所帮助。