使用现有同级 属性 值对 属性 进行 Jackson 多态反序列化
Jackson polymorphic deserialization of property using an existing sibling property value
我有一个现有的 Request
/Response
协议使用 JSON
我无法控制。
示例 1:响应 JSON
不需要任何多态反序列化
{
"name" : "simple_response"
"params" : {
"success" : true
}
}
示例 2:响应 JSON
需要参数的多态反序列化 属性
{
"name" : "settings_response",
"params" : {
"success" : true,
"settings" : "Some settings info"
}
}
我的 class 结构如下所示:
class Response { // Not abstract. Used if no specialized response properties needed
@JsonProperty("params")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "name")
@JsonSubTypes({
@JsonSubTypes.Type(value=GetSettingsResponseParams.class, name="settings_response")
})
Params params;
String name; // Need to use its value to determine type of params
}
class Params {
boolean success;
}
class GetSettingsResponseParams extends Params {
String settings;
}
当我尝试反序列化 "Example 2" 中的 JSON
时,我得到:
Unexpected token (END_OBJECT), expected VALUE_STRING: need JSON String that contains type id (for subtype of com.foo.Params)
我做错了什么,我该如何解决?
Response
模型应如下所示:
class Response {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "name", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = GetSettingsResponseParams.class, name = "settings_response"),
@JsonSubTypes.Type(value = Params.class, name = "simple_response")
})
private Params params;
private String name;
// getters, settets, toString, etc.
}
以上模型适用于两个 JSON
有效载荷。
我有一个现有的 Request
/Response
协议使用 JSON
我无法控制。
示例 1:响应 JSON
不需要任何多态反序列化
{
"name" : "simple_response"
"params" : {
"success" : true
}
}
示例 2:响应 JSON
需要参数的多态反序列化 属性
{
"name" : "settings_response",
"params" : {
"success" : true,
"settings" : "Some settings info"
}
}
我的 class 结构如下所示:
class Response { // Not abstract. Used if no specialized response properties needed
@JsonProperty("params")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "name")
@JsonSubTypes({
@JsonSubTypes.Type(value=GetSettingsResponseParams.class, name="settings_response")
})
Params params;
String name; // Need to use its value to determine type of params
}
class Params {
boolean success;
}
class GetSettingsResponseParams extends Params {
String settings;
}
当我尝试反序列化 "Example 2" 中的 JSON
时,我得到:
Unexpected token (END_OBJECT), expected VALUE_STRING: need JSON String that contains type id (for subtype of com.foo.Params)
我做错了什么,我该如何解决?
Response
模型应如下所示:
class Response {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "name", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = GetSettingsResponseParams.class, name = "settings_response"),
@JsonSubTypes.Type(value = Params.class, name = "simple_response")
})
private Params params;
private String name;
// getters, settets, toString, etc.
}
以上模型适用于两个 JSON
有效载荷。