Как десериализовать мой неизменный подкласс? - PullRequest
1 голос
/ 19 мая 2019

Я сейчас пытаюсь десериализовать JSON-ответ. Мой объект использует шаблон построителя и потребительский интерфейс.

Я делаю http-запрос к внешнему источнику и получаю ответ как json. Все ответы являются строками и выглядят так:

{
    "a": "198",
    "b": "F",
    "c": "30",
    "d": "2019-02-01",
    "e": "2019-12-31"
}

Я изменил название своей модели и мой ключ на Модель и ключ, поэтому возможны опечатки, извините за это.


@JsonDeserialize(builder = Model.Builder.class)
public class Model {
    private final Data data;

    private Model() {
        this.data = new Data();
    }

    /**
     * @return key
     */
    public Key getKey() {
        return data.key;
    }

    /**
     * @return Tax Form
     */
    public String getTaxForm() {
        return data.taxForm;
    }

    /**
     * @return tax table
     */
    public int getTaxTable() {
        return data.taxTable;
    }

    /**
     * @return tax percent
     */
    public BigDecimal getTaxPercent() {
        return data.taxPercent;
    }

    /**
     * @return Valid from
     */
    public LocalDate getValidFrom() {
        return data.validFrom;
    }

    /**
     * @return Valid to
     */
    public LocalDate getValidTo() {
        return data.validTo;
    }

    /**
     * @param key key
     * @return builder
     */
    public static Builder getBuilder(Key key) {
        return new Builder(key);
    }

    /**
     * @param model the response
     * @return builder
     */
    public static Builder getBuilder(Model model) {
        return new Builder(model);
    }

    /**
     * builder
     */
    public static class Builder {
        @JsonDeserialize(as = Model.Data.class)
        private final Data data;
        @JsonCreator
        private Builder(Key key) {
            this.data = new Data();
            this.data.key = key;
        }

        private Builder(Model model) {
            this(model.data.key);
            data.taxForm = model.data.taxForm;
            data.taxTable = model.data.taxTable;
            data.taxPercent = model.data.taxPercent;
            data.validFrom = model.data.validFrom;
            data.validTo = model.data.validTo;
        }

        public Builder with(Consumer<Data> consumer) {
            consumer.accept(this.data);
            return this;
        }

        public Model build() {
            Model internalModel = new Model();
            internalModel.data.key = data.key;
            internalModel.data.taxForm = data.taxForm;
            internalModel.data.taxTable = data.taxTable;
            internalModel.data.taxPercent = data.taxPercent;
            internalModel.data.validFrom = data.validFrom;
            internalModel.data.validTo = data.validTo;
            return internalModel;
        }
    }

    /**
     * Data
     */
    public static final class Data implements Serializable {
        private Key key;
        @JsonProperty("b")
        public String taxForm;
        public int taxTable;
        public BigDecimal taxPercent;
        public LocalDate validFrom;
        public LocalDate validTo;
    }
}
public class Key {
    private final String personalNumber;

    public Key(@JsonProperty("a") String personalNumber) {
        this.personalNumber = personalNumber;
    }

    public String getPersonalNumber() {
        return personalNumber;
    }
}


В настоящее время я могу десериализовать a, но все остальные поля пропущены. Я пытался использовать @JsonProperty в классе данных, но это не работает. Есть идеи?

...