Во-первых, у меня есть следующее класс:
Код: Выделить всё
@JsonIgnoreProperties(ignoreUnknown = true)
public class Instance {
@JsonProperty("id")
private String id;
@JsonProperty("name")
private String name;
@JsonProperty("type")
private InstanceType type;
}
Решение 1:
Код: Выделить всё
@JsonDeserialize(using = InstanceTypeDeserializer.class)
public interface InstanceType {
String value();
}
@JsonDeserialize(as = HardInstanceType.class)
public enum HardInstanceType implements InstanceType {
FIRST_TYPE("first_type"),
SECOND_TYPE("second_type")
private String value;
HardInstanceType(String value) {
this.value = value;
}
@JsonValue
public String value() {
return value;
}
}
@JsonDeserialize(as = SoftInstanceType.class)
public enum SoftInstanceType implements InstanceType {
//.. types implementaion similar as HardInstanceType
}
public class InstanceTypeDeserializer extends JsonDeserializer {
@Override
public InstanceType deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);
if(root.get("name").asText().equals("hard")) {
return mapper.readValue(root.toString(), HardInstanceType.class);
} else {
return mapper.readValue(root.toString(), SoftInstanceType.class);
}
}
}
Разбор исключений json:
com.fasterxml.jackson.databind.JsonMappingException: class
com.fasterxml.jackson.databind.node.TextNode невозможно привести к классу
com.fasterxml.jackson.databind.node.ObjectNode
(com.fasterxml.jackson.databind.node.TextNode и
com.fasterxml.jackson.databind.node.ObjectNode находятся в безымянном модулезагрузчика org.springframework.boot.loader.LaunchedURLClassLoader
@1a3e8e24) (через цепочку ссылок:
java.util.ArrayList[0]->com.project.package.xxxx.Instance["type"])
Решение 2[/b]
Код: Выделить всё
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "name")
@JsonSubTypes({
@JsonSubTypes.Type(value = HardInstanceType.class, name = "hard") })
public interface InstanceType {
String value();
}
Код: Выделить всё
"id": "1",
"name": "hard",
"type": [
"hard",
"first_type"
]
Конечно, класс Instace более сложный и с большим количеством полей, я сокращаю его здесь, просто для примера.
Мне нужна помощь с этим, заранее большое спасибо .
Подробнее здесь: https://stackoverflow.com/questions/681 ... iple-types
Мобильная версия