Почему ObjectMapper.writeValueAsString() вставляет нечетные свойства с исходными свойствами в нижнем верблюжьем регистре?

У меня есть ввод в формате JSON, например

{
    "msisdn" : "<some value>",
    "currentStackType" : "<some value>",
    "msisdnDestination" : "<some value>",
    "ncMigrationStatus" : "<some value>",
    "spid" : "<some value>",
    "ncMigrationTimestamp" :  "2019-01-16 18:04:26"
}

в классе, в который я должен десериализовать упомянутые поля данных JSON, названы идентично соответствующим полям JSON. Также я использую аннотации @JsonProperty, потому что без них «currentStackType», «msisdnDestination» и «ncMigrationStatus» не распознаются ObjectMapper.

После вызова ObjectMapper.readValue(json, <MyClassName>.class) я замечаю, что десериализация прошла успешно.

Но после этого для ведения журнала я делаю обратное действие и наблюдаю следующее:

{
    "migrationStatus": "<some value>",
    "destination": "<some value>",
    "migrationTimestamp": "<some value>",
    "stackType": "<some value>",
    "msisdn": "<some value>",
    "currentStackType": "<some value>",
    "msisdnDestination": "<some value>",
    "ncMigrationStatus": "<some value>",
    "ncMigrationTimestamp": "2019-01-16 06:04:26",
    "spid": "<some value>"
}

Все поля, названные в нижнем верблюжьем регистре, на самом деле дублируются с «урезанными» именами.

Есть ли способ устранить это, кроме переименования свойств JSON?

Я пытался установить PropertyNamingStrategy напрямую, но ничего не изменилось.

Мой класс выглядит как

public class ******* {
    @JsonProperty("msisdn")
    @NotBlank(message = "'MSISDN' should not be blank")
    private String msisdn;

    @JsonProperty("currentStackType")
    @NotBlank(message = "'Current Stack Type' should not be blank")
    private String currentStackType;

    @JsonProperty("msisdnDestination")
    @NotBlank(message = "'MSISDN Destination' should not be blank")
    private String msisdnDestination;

    @JsonProperty("ncMigrationStatus")
    @NotBlank(message = "'NC Migration Status' should not be blank")
    private String ncMigrationStatus;

    @JsonProperty("ncMigrationTimestamp")
    @NotNull(message = "'NC Migration Timestamp' should not be null")
    private Date ncMigrationTimestamp;

    @JsonProperty("spid")
    @NotBlank(message = "'SPID' should not be blank")
    private String spid;

    public *******() {
    }

    public void setMSISDN(String val) {
        msisdn = val;
    }

    public String getMSISDN() {
        return msisdn;
    }

    public void setStackType(String val) {
        currentStackType = val;
    }

    public String getStackType() {
        return currentStackType;
    }

    public void setDestination(String val) {
        msisdnDestination = val;
    }

    public String getDestination() {
        return msisdnDestination;
    }

    public void setMigrationStatus(String val) {
        ncMigrationStatus = val;
    }

    public String getMigrationStatus() {
        return ncMigrationStatus;
    }

    public void setMigrationTimestamp(Date val) {
        ncMigrationTimestamp = val;
    }

    public Date getMigrationTimestamp() {
        return ncMigrationTimestamp;
    }

    public void setSPID(String val) {
        spid = val;
    }

    public String getSPID() {
        return spid;
    }
}

Я должен скрыть некоторые детали, извините.


person Spielman    schedule 16.05.2019    source источник
comment
Не могли бы вы опубликовать свой класс pojo?   -  person vc73    schedule 16.05.2019
comment
да, с некоторыми ограничениями :-) прикрепил к сообщению   -  person Spielman    schedule 16.05.2019
comment
stackoverflow.com/a/11548495/11173046 Какую версию Джексона вы используете? Если ‹ 1.9, попробуйте аннотировать геттер и сеттер с помощью @JsonProperty вместо поля.   -  person Not a JD    schedule 16.05.2019


Ответы (1)


Я нашел основную причину: имена методов установки и получения должны соответствовать шаблону <set/get><full name of corresponding class data member>.

Верблюжий регистр также должен совпадать, за единственным исключением: первая буква после set/get слова должна быть заглавной. Вероятно, с помощью аннотаций можно применить некоторую гибкость, но я еще не пробовал.

person Spielman    schedule 17.05.2019