Kotlin 无类型的Jackson反序列化
我有一个与Jackson和多态性相关的问题:有没有一种方法可以在不指定类型的情况下反序列化JSON字符串 假设我不拥有此消息(例如,外部API),并且我有两条在不同时间传入的独立消息:Kotlin 无类型的Jackson反序列化,kotlin,jackson,deserialization,Kotlin,Jackson,Deserialization,我有一个与Jackson和多态性相关的问题:有没有一种方法可以在不指定类型的情况下反序列化JSON字符串 假设我不拥有此消息(例如,外部API),并且我有两条在不同时间传入的独立消息: { "responseCode": 200 "responseMessage": "You did something successfully" } { "errorCode": 401 "errorDescription": "Permission denied" } 我想
{
"responseCode": 200
"responseMessage": "You did something successfully"
}
{
"errorCode": 401
"errorDescription": "Permission denied"
}
我想用我通过多态性基于这些消息创建的一些数据类来反序列化此消息(请参见下一个代码块中的抽象类):
我通过一个函数解析这些消息,该函数将使用Jackson对象映射器来反序列化字符串化的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)
*/
}
@JsonSubTypes(
类型(值=MyDataClass::class),
JsonSubTypes.Type(值=MyOtherDataClass::class)
)
@JsonIgnoreProperties(ignoreProperties=true)
抽象类MyAbstractClass
fun receiveMessage(消息:字符串){
val convertedMessage=jacksonObjectMapper().readValue(消息)
log.info(convertedMessage)
/*打印以下内容之一:
MyDataClass(responseCode=200,responseMessage=您成功地完成了某些操作)
或
MyOtherDataClass(errorCode=401,errorDescription=权限被拒绝)
*/
}
但是因为我没有描述如何识别数据类(使用@JsonTypeInfo
),所以它失败了
重复一遍,我很好奇是否有一种方法可以将传入消息反序列化为我的多态类型之一,而不必指定
@JsonTypeInfo
。或者,如果我必须描述@JsonTypeInfo
,在MyAbstractClass
的两个子类之间没有相似性的情况下,我将如何实现这一点?我将编写一个自定义反序列化程序,将其作为通用的JSONObject
或类似的东西。然后我会检查是否存在区分键。例如:
// pseudocode
when (json: JSONObject) {
hasKey("responseCode") -> // deserialize as MyDataClass
hasKey("errorCode") -> // deserialize as MyOtherDataClass
}
有趣的方法。我想我的观点也很幼稚。由于Kotlin是强类型的,我不希望Jackson自动提取我的数据类。此外,我猜with
receiveMessage(jsonObject:jsonObject)
将是参数,然后在使用时使用语句。这将消除带有注释的抽象类MyAbstractClass
的用例,对吗?正确,MyAbstractClass
将不再使用。谢谢!我感谢你的帮助。
// pseudocode
when (json: JSONObject) {
hasKey("responseCode") -> // deserialize as MyDataClass
hasKey("errorCode") -> // deserialize as MyOtherDataClass
}