サーバーは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) {
}
}
上記の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
これはクラスでは機能しません。
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"),
})
「抽象クラスをインスタンス化できない」という条件を解析しようとすると失敗し、タイプに関する詳細情報が必要になります。したがって、より深い解析でアノテーション宣言が失われるように見えます。
元のJSONのjacksonを使用して逆シリアル化を記述できるかどうか疑問に思います
Not
2番目のアプローチが逆シリアル化に機能しない理由