Jackson JsonMappingException .No Конструктор / фабричный метод строкового аргумента для десериализации из строкового значения - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь десериализовать следующие JSON:

 {
    "name": "myName",
    "decoder": "myDecoder",
    "id": 123,
    "definition": {
        "AND": [
            "and-condition-1",
            "and-condition-2",
            {
                "OR": [
                    "or-condition-1",
                    "or-condition-2"
                ]
            }
        ]
    }
}

Я десериализовал файл:

  ObjectMapper mapper = new ObjectMapper();
  RuleDefinition ruleDefinition = mapper.readValue(new File(fileName), RuleDefinition.class);

в следующую объектную структуру:

RuleDefinition. java

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class RuleDefinition {

    @JsonProperty("name")
    private String name;

    @JsonProperty("decoder")
    private String decoder;

    @JsonProperty("id")
    private int id;

    @JsonProperty("definition")
    private Definition definition;

    @JsonProperty("name")
    public String getName() {
        return name;
    }

    @JsonProperty("name")
    public void setName(String name) {
        this.name = name;
    }

    @JsonProperty("decoder")
    public String getDecoder() {
        return decoder;
    }

    @JsonProperty("decoder")
    public void setDecoder(String decoder) {
        this.decoder = decoder;
    }

    @JsonProperty("id")
    public int getId() {
        return id;
    }

    @JsonProperty("id")
    public void setId(int id) {
        this.id = id;
    }

    @JsonProperty("definition")
    public Definition getDefinition() {
        return definition;
    }

    @JsonProperty("definition")
    public void setDefinition(Definition definition) {
        this.definition = definition;
    }

    @Override
    public String toString() {
        return "RuleDefinition{" +
                "name='" + name + '\'' +
                ", decoder='" + decoder + '\'' +
                ", id=" + id +
                ", definition=" + definition +
                '}';
    }
}

Definition. Java

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Definition {

    @JsonProperty("AND")
    private List<AND> AND;

    public List<AND> getAND() {
        return AND;
    }

    public void setAND(List<AND> AND) {
        this.AND = AND;
    }

    @Override
    public String toString() {
        return "Definition{" +
                "AND=" + AND +
                '}';
    }
}

AND. java

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class AND {

    @JsonProperty("OR")
    private List<String> Or;

    @JsonProperty("OR")
    public List<String> getOR() {
        return Or;
    }

    @JsonProperty("OR")
    public void setOR(List<String> Or) {
        this.Or = Or;
    }


    @Override
    public String toString() {
        return "AND{" +
                "Or=" + Or +
                '}';
    }
}

и я получил следующую ошибку:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.model.AND: no String-argument constructor/factory method to deserialize from String value ('and-condition-1')

Я вижу, что проблема связана с 'and-condition-1', которое является просто значением, как мне их десериализовать, я хотел знать, должен ли я писать собственный десериализатор (или) Есть ли какие-либо работать?

1 Ответ

1 голос
/ 17 июня 2020

Я думаю, проблема в том, что в вашем JSON объект AND является одновременно строкой и объектом. Вы должны создать для него JsonDeserializer.

введите описание ссылки здесь введите описание ссылки здесь

...