Почему ObjectMapper.writeValueAsString () вставляет нечетные свойства с оригинальными свойствами в случае низкого верблюда? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть форматированный ввод 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;
    }
}

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

1 Ответ

0 голосов
/ 17 мая 2019

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

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

...