我有一个包含另一个对象属性的对象,如下所示:
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)
有什么办法可以做到这一点吗?
根据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
| 归档时间: |
|
| 查看次数: |
3832 次 |
| 最近记录: |