Джексон JSONDeserialize + Builder с другим именем поля? - PullRequest
0 голосов
/ 12 июня 2018

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

Рабочий пример:

@JsonDeserialize(builder = ProfilePrimaryData.Builder.class)
@Value
@ParametersAreNonnullByDefault
@Builder(builderClassName = "Builder")
private static class ProfilePrimaryData {
    private final Boolean hasProfile;

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {
    }
}

Если свойство JSON имеет hasProfile, оно работает нормально, но если оно имеет has_profile (именно это пишет наш клиент), оно не работает, и яполучить ошибку: Unrecognized field "has_profile" (class com.mypackagehere.something.$ProfilePrimaryData$Builder), not marked as ignorable (one known property: "hasProfile"]).Я попытался добавить аннотацию JsonProperty в hasProfile, как это, но он все еще не работает:

@JsonDeserialize(builder = ProfilePrimaryData.Builder.class)
@Value
@ParametersAreNonnullByDefault
@Builder(builderClassName = "Builder")
private static class ProfilePrimaryData {
    @JsonProperty("has_profile")
    private final Boolean hasProfile;

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {
    }
}

Я неправильно понимаю, как это должно работать?

1 Ответ

0 голосов
/ 12 июня 2018

Ошибка ясно говорит о том, что Unrecognized field "has_profile" (class com.mypackagehere.something.$ProfilePrimaryData$Builder)
т.е. has_profile отсутствует в классе Builder, а не ProfilePrimaryData, поэтому необходимо аннотировать свойства класса Builder.

@JsonDeserialize(builder = ProfilePrimaryData.Builder.class)
public class ProfilePrimaryData {

    /*
     * This annotation only needed, if you want to
     * serialize this field as has_profile,
     * 
     * <pre>
     * with annotation
     * {"has_profile":true}
     * 
     * without annotation
     * {"hasProfile":true}
     * <pre>
     *  
     */
    //@JsonProperty("has_profile")
    private final Boolean hasProfile;

    private ProfilePrimaryData(Boolean hasProfile) {
        this.hasProfile = hasProfile;
    }

    public Boolean getHasProfile() {
        return hasProfile;
    }

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {

        // this annotation is required
        @JsonProperty("has_profile")
        private Boolean hasProfile;

        public Builder hasProfile(Boolean hasProfile) {
            this.hasProfile = hasProfile;
            return this;
        }

        public ProfilePrimaryData build() {
            return new ProfilePrimaryData(hasProfile);
        }
    }
}
...