我有一个包含另一个对象属性的对象,如下所示:
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":""
}
有什么办法吗?
答案 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,它们被委派给fB1
和fB2
字段的getter和setter。