Jackson 的 @JsonPropertyOrder 不适用于 @JsonUnwrapped

Mor*_*gel 1 java json orders

我有一个包含另一个对象属性的对象,如下所示:

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));
    }

}
Run Code Online (Sandbox Code Playgroud)

我想要的是生成尊重这个顺序的json:

{
  "fA1":"",
  "fB1":"",
  "fA2":"",
  "fB2":""
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?

cas*_*lin 5

根据GitHub 上的 jackson-databind 存储库中的此问题@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();
}
Run Code Online (Sandbox Code Playgroud)

@JsonIgnore注释将确保该b属性不会被 Jackson 序列化。

并且@Delegate注释将告诉 Lombok 生成将调用转发给B方法的委托方法。这样,该类将具有被委托给和字段A的 getter 和 setter 的 getter 和 setter 。fB1fB2