Подтипы Джексона JSON: Не удается десериализовать

#java #json #jackson

Вопрос:

Я получаю следующую ошибку

 "JSON parse error: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class com.foo.model.conditionfields.BaseConditionField; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT),
 

Мой класс BaseConditionField — это

 @Data
public abstract class BaseConditionField implements Serializable {

  protected ConditionType type;
  protected ConditionOperator op;

  @JsonProperty("op")
  public void setOp(ConditionOperator op) {
    if (!getSupportedOperators().contains(op)) {
      throw new ValidationException(
        format("Operator '%s' is not supported for '%s'", op, this.getClass().getSimpleName())
      );
    }
    this.op = op;
  }

  @JsonProperty("type")
  public void setType(String value) {
    this.type = ConditionType.forString(value);
  }

  public String getType() {
    return this.type.toString();
  }

  protected abstract Set<ConditionOperator> getSupportedOperators();
}
 

И это поле

 @Data
public class EvaluateConditionField extends BaseConditionField {

  @Setter
  @Getter(AccessLevel.NONE)
  @ConditionType.TypeInfo
  private List<BaseConditionField> condition;

  @Override
  protected Set<ConditionOperator> getSupportedOperators() {
    return of(ConditionOperator.AND, ConditionOperator.OR);
  }
}
 

Который должен быть преобразован из JSON

   @Type(type = "jsonb")
  @Column(columnDefinition = "jsonb")
  private EvaluateConditionField conditions;
 

Предполагается, что у него должна быть рекурсивная цепочка и/или предложение.

Мое определение типа:

 @Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum ConditionType {
  EVALUATE_NESTED("evaluate.nested", EvaluateConditionField.class),
  PROJECT_FIELD("project.field", ProjectConditionField.class);

  private String value;
  private Class<? extends BaseConditionField> filterClazz;

  @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
  public static ConditionType forString(String value) {
    return stream(ConditionType.values())
      .filter(v -> v.value.equals(value))
      .findFirst()
      .orElseThrow(
        () -> new ValidationException(String.format("Invalid Condition Type : %s", value))
      );
  }

  @Override
  @JsonValue
  public String toString() {
    return this.value;
  }

  @Target(ElementType.FIELD)
  @Retention(RetentionPolicy.RUNTIME)
  @JacksonAnnotationsInside
  @JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
    property = "type"
  )
  @JsonSubTypes(
    {
      @JsonSubTypes.Type(value = ProjectConditionField.class, name = "project.field"),
      @JsonSubTypes.Type(value = EvaluateConditionField.class, name = "evaluate.nested")
    }
  )
  public @interface TypeInfo {
  }
}
 

JSON

 [
    {
        "name": "Test Action Opp",
        "accessRoles": [
            "lead",
            "collaborator"
        ],
        "conditions": {
            "type": "evaluate.nested",
            "op": "or",
            "condition": [
                {
                    "type": "evaluate.nested",
                    "op": "and",
                    "condition": [
                        {
                            "op": "eq",
                            "type": "project.field",
                            "value": "In process"
                        }
                    ]
                }
            ]
        },
        "actions": [
            {
                "type": "set.field.value",
                "actionInfo": {
                    "fieldId": "forecast_status",
                    "sectionId": "sales_details",
                    "source": "defined",
                    "value": "Verify"
                }
            }
        ],
        "displayConfig": ""{}"",
        "isAutomated": false
    }
]
 

Не уверен, в чем проблема. Я попытался изменить его на обычный массив, но он тоже не работал. Я думаю, что я правильно их определил.

Комментарии:

1. И что такое строка json?

2. Добавлена строка