Джексон возвращает несколько (дубликатов) полей - PullRequest
0 голосов
/ 28 октября 2019

JAVA POJO:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

@Getter @Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test1 {
    @JsonProperty("aBCFeexxxx")
    private double aBCFee;

}

ИСПЫТАТЕЛЬНЫЙ КОД:

public static void main(String[] args) throws JsonProcessingException {
        Test1 t = new Test1();
        t.setABCFee(10l);       
        System.out.println((new ObjectMapper()).writeValueAsString(t));
    }

ВЫХОД: {"abcfee":10.0,"aBCFeexxxx":10.0}

Почему acbfee возвращается на выходе? Ожидается, что мы должны вернуть только aBCFeexxxx

Что я делаю не так?

PS:

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

1 Ответ

1 голос
/ 28 октября 2019

Ломбок и Джексон не согласны с соглашением о присвоении имен для получателей и установщиков свойства с именем aBCFee.

Я не использую Lombok, поэтому я попросил Eclipse создать для меня получатель / установщик, и яполучил:

@JsonInclude(JsonInclude.Include.NON_NULL)
class Test1 {
    @JsonProperty("aBCFeexxxx")
    private double aBCFee;

    public double getaBCFee() {
        return this.aBCFee;
    }
    public void setaBCFee(double aBCFee) {
        this.aBCFee = aBCFee;
    }
}

Как видите, метод установки называется setaBCFee, а не setABCFee. Этот код работал нормально.

{"aBCFeexxxx":10.0}

Когда я затем переименовал методы, чтобы соответствовать тому, что у вас было:

public double getABCFee() {
    return this.aBCFee;
}
public void setABCFee(double aBCFee) {
    this.aBCFee = aBCFee;
}

Я получил то, что вы получили:

{"abcfee":10.0,"aBCFeexxxx":10.0}

Как вы можете видеть, Джексон в нижнем регистре первые 4 символа, а не только первый, так что в отношении Джексона, свойство abcfee, определенное getter / setter, отличается от свойства aBCFee, определенного полем,и, следовательно, вы получаете два свойства в тексте JSON.

Соглашение об именах Java предназначено для прописных сокращений, например, "большой HTML-документ" должен называться bigHtmlDoc в качестве поля и setBigHtmlDoc в качестве полясеттер. Я рекомендую вам переименовать ваше поле abcFee.

@JsonInclude(JsonInclude.Include.NON_NULL)
class Test1 {
    @JsonProperty("aBCFeexxxx")
    private double abcFee;

    public double getAbcFee() {
        return this.abcFee;
    }

    public void setAbcFee(double abcFee) {
        this.abcFee = abcFee;
    }
}

Джексон доволен тем, что:

{"aBCFeexxxx":10.0}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...