#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. Добавлена строка