杰克逊的@JsonPropertyOrder不适用于@JsonUnwrapped

时间:2019-09-24 13:44:07

标签: 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));
    }

}

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

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

有什么办法吗?

1 个答案:

答案 0 :(得分:1)

根据GitHub上jackson-databind存储库中的this issue@JsonPropertyOrder注释不能与@JsonUnwrapped注释一起使用。参见下面的引用:

  

真正的,未包装的属性不包含在订购中,因为将序列化程序作为常规属性并不真正知道它们。具体地说,实际上,它们将作为每个包含的属性块输出,因此即使已知它们也不能单独重新排序。

     

一旦我们到达那里,也许杰克逊3.x可以做些事情。


但是您可以考虑采用解决方法:由于您似乎正在使用Lombok,因此可以用@Delegate@JsonIgnore来注释b

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

    private String fA1;
    private String fA2;

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

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

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