杰克逊反序列化,无类型



>我有一个与杰克逊和多态性有关的问题:有没有办法在不指定类型的情况下反序列化 JSON 字符串?

假设我不拥有此消息(例如,外部 API(,并且我有两个单独的消息在不同时间传入:

{
"responseCode": 200
"responseMessage": "You did something successfully"
}
{
"errorCode": 401
"errorDescription": "Permission denied"
}

我想用我通过多态性基于这些消息创建的一些数据类反序列化此消息(请参阅下一个代码块中的抽象类(:

data class MyDataClass(
val responseCode: Int,
val responseMessage: String
): MyAbstractClass()
data class MyOtherDataClass(
val errorCode: Int,
val errorDescription: String
): MyAbstractClass()

我正在通过一个函数解析这些消息,该函数将使用杰克逊对象映射器来反序列化字符串化的 JSON 有效负载:

@JsonSubTypes(
JsonSubTypes.Type(value = MyDataClass::class),
JsonSubTypes.Type(value = MyOtherDataClass::class)
)
@JsonIgnoreProperties(ignoreProperties = true)
abstract class MyAbstractClass
fun receiveMessage(message: String) {
val convertedMessage = jacksonObjectMapper().readValue<MyAbstractClass>(message)
log.info(convertedMessage)
/* prints either:
MyDataClass(responseCode=200, responseMessage=You did something successfully)
OR
MyOtherDataClass(errorCode=401, errorDescription=Permission denied)
*/
}

但是由于我没有描述如何识别数据类(使用@JsonTypeInfo(,它失败了。

重复一遍,我很好奇是否有一种方法可以将传入消息反序列化为我的多态类型之一,而无需指定@JsonTypeInfo。或者,如果我必须描述@JsonTypeInfo,我将如何做到这一点,MyAbstractClass的两个子类之间没有相似之处?

我会编写一个自定义反序列化程序,将其作为通用JSONObject或类似的东西。然后我会检查是否存在区分键。例如:

// pseudocode
when (json: JSONObject) {
hasKey("responseCode") -> // deserialize as MyDataClass
hasKey("errorCode") -> // deserialize as MyOtherDataClass
}

最新更新