Как упорядочить Json при десериализации с помощью аннотации?

#java #json #spring-boot #jackson #gson

#java #json #весенняя загрузка #джексон #gson

Вопрос:

Я использую следующую полезную нагрузку запроса:

 {
    "accountId": "8b7d80bd-120e-4059-9802-a8af9ac04038",
    "name": "Client sucqtixp",
    "email": "Niles@qa4life.com",
    "phone": "1234567890",
    "frequency": "MONTHLY"
    "paymentMethod": {
        "id": "00eef328-bd2c-4ccb-8b8e-12bd0c2552ad",
        "type": "BANK_ACCOUNT"
    }
}
  

Я использую @RequestBody :

 @Data
@JsonInclude( JsonInclude.Include.NON_NULL )
public class AccountVO
{
    private UUID accountId;

    private String name;

    private String email;

    private String phone;

    private String frequency;

    private PaymentMethodVO paymentMethod;

    public void setPaymentMethod( PaymentMethodVO paymentMethod )
    {
        paymentMethod.setSevaluation( paymentMethod.getSevaluation() == null ? Frequency.valueOf( this.sevaluation ) : paymentMethod.getSevaluation() );
        this.paymentMethod = paymentMethod;
    }
}
  

Я пытаюсь установить частоту учетной записи на частоту PaymentMethod, если она не указана, но когда в запросе json frequency отправляется после paymentMethod , тогда null появляется в частоте PaymentMethod.

Я хочу, чтобы, если запрос json поступал в любом порядке, он делал то же самое.

Я использую spring boot и com.fasterxml.jackson.annotation .

Ответ №1:

Если я понимаю вашу проблему, вам необходимо выполнить некоторую обработку ваших свойств при создании экземпляра AccountVO .

Итак, вы могли бы использовать @JsonCreator в конструкторе:

 @Data
@JsonInclude(Include.NON_NULL)
public class AccountVO {

    // Fields omitted

    public AccountVO(@JsonProperty("accountId") String accountId,
                     @JsonProperty("name") String name,
                     @JsonProperty("email") String email,
                     @JsonProperty("phone") String phone,
                     @JsonProperty("frequency") String frequency,
                     @JsonProperty("paymentMethod") PaymentMethodVO paymentMethod) {

        this.accountId = accountId;
        this.name = name;
        this.email = email;
        this.phone = phone;
        this.frequency = frequency;
        this.paymentMethod = paymentMethod; // Do any other processing here
    }
}
  

В качестве альтернативы, вы могли бы использовать @JsonCreator в фабричном методе:

 @Data
@JsonInclude(Include.NON_NULL)
public class AccountVO {

    // Fields omitted

    @JsonCreator
    public static AccountVO factory(
                     @JsonProperty("accountId") String accountId,
                     @JsonProperty("name") String name,
                     @JsonProperty("email") String email,
                     @JsonProperty("phone") String phone,
                     @JsonProperty("frequency") String frequency,
                     @JsonProperty("paymentMethod") PaymentMethodVO paymentMethod) {

        AccountVO account = new AccountVO();
        account.setAccountId(accountId);
        account.setName(name);
        account.setEmail(email);
        account.setPhone(phone);
        account.setFrequency(frequency);
        account.setPaymentMethod(paymentMethod); // Do any other processing here
        return account;
    }
  

Комментарии:

1. я использовал @JsonPropertyOrder({ "accountId", "name", "email", "phone", "frequency", "paymentMethod" }) , но все еще получаю ту же проблему. Есть ли какие-либо другие аннотации, которые можно использовать для упорядочения?

2. Когда я использовал @JsonPropertyOrder и отлаживал setPaymentMethod , тогда this.sevaluation есть null , но я передаю значение sevaluation before paymentMethod .

3. @ankit Вы могли бы попробовать @JsonCreator вместо этого. Позвольте мне соответствующим образом обновить свой ответ.