@JsonPropertyOrder Джексона не работает с @JsonUnwrapped - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть объект, который содержит другой атрибут объекта, такой как:

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

@JsonPropertyOrder({"fA1","b","fA2"})
@Data
public class A {
    private String fA1;
    private String fA2;

    @JsonUnwrapped
    private B b = new B();

    @Data
    class B {
        private String fB1;
        private String fB2;
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        A a = new A ();
        System.out.println(objectMapper.writeValueAsString(a));
    }

}

, что я хочу, это сгенерировать JSON, который уважает этот порядок:

{
  "fA1":"",
  "fB1":"",
  "fA2":"",
  "fB2":""
}

Есть ли способ сделатьэто?

1 Ответ

1 голос
/ 24 сентября 2019

Согласно этой проблеме в хранилище jackson-databind на GitHub, аннотация @JsonPropertyOrder не работает с аннотацией @JsonUnwrapped.См. Цитату ниже:

Правда, развернутые свойства не включаются в порядок, так как они на самом деле не известны, заключая в себе сериализатор как обычные свойства.И, в частности, как вещи, будут выводиться как блок свойств в отдельности, поэтому даже если они известны, они не могут быть переупорядочены по отдельности.

Возможно, что-то можно будет сделать с Jackson 3.x, как только мы туда доберемся.


Но вы можете рассмотреть обходной путь : как вам кажетсяиспользуя Lombok, вы можете комментировать b с @Delegate и @JsonIgnore:

@Data
@JsonPropertyOrder({"fa1", "fb1", "fa2", "fb2"})
public class A {

    private String fA1;
    private String fA2;

    @Delegate
    @JsonIgnore
    private B b = new B();
}

@JsonIgnoreаннотация гарантирует, что свойство b не будет сериализовано Джексоном.

А аннотация @Delegate скажет Lombok генерировать методы делегата, которые перенаправляют вызов в методы B,При этом класс A будет иметь методы получения и установки, которые делегируются получателям и установщикам полей fB1 и fB2.

...