Сервер возвращает такую часть json:
{"condition": {
"or": [
{
"and": [
{
"operand": "a",
"operator": "==",
"value": "true"
},
{
"not": {
"operand": "b",
"operator": "==",
"value": "true"
}
}
]
},
{
"and": [
{
"operand": "b",
"operator": "==",
"value": "true"
},
{
"not": {
"operand": "a",
"operator": "==",
"value": "true"
}
}
]
}
]
}}
Я написал следующую иерархию классов:
public interface Condition {}
public class Expression implements Condition {
public Expression(String operator, String operand, String value) {
}
}
public class Not implements Condition {
public Not(Condition condition) {
}
}
public abstract class GroupOperation implements Condition {
public GroupOperation (List<Condition> conditions) {
}
}
public class And extends GroupOperation {
public And(List<Condition> conditions) {
}
}
public class Or extends GroupOperation {
public Or(List<Condition> conditions) {
}
}
Я добавил следующие аннотации jackson в надежде десериализовать json выше:
@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value=Not.class, name="not"),
@JsonSubTypes.Type(value=And.class, name="and"),
@JsonSubTypes.Type(value=Or.class, name="or"),
@JsonSubTypes.Type(value=Expression.class, name=""),
})
Я обозначил соответствующие конструкторы как @JsonCreator
.
Это не работает для класса Expression
.
Если я изменяю json, что каждый объект выражение имеет имя "выражение":
"expression" : {
"operand": "a",
"operator": "==",
"value": "true"
}
и
@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value=Not.class, name="not"),
@JsonSubTypes.Type(value=And.class, name="and"),
@JsonSubTypes.Type(value=Or.class, name="or"),
@JsonSubTypes.Type(value=Expression.class, name="expression"),
})
Ошибка при попытке разобрать условие "нет", говоря, что "не может создавать абстрактные классы для получения дополнительной информации о типе". Похоже, что он теряет декларацию аннотаций при более глубоком анализе.
- Интересно, можно ли написать десериализацию с jackson для оригинала json
- Почему второй подход не работает для десериализации
Not