您可以通过使用 mixins 和注解来配置特定属性的展开:
1. 混合
假设您定义了以下 mixin:
public abstract class UnwrappedAddresses {
@JsonUnwrapped
public abstract Household getHouseHold();
}
然后向您的 objectMapper 添加一个自定义模块,该模块将 mixin 应用于 Person 类,如下所示:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper .registerModule(new SimpleModule() {
@Override
public void setupModule(SetupContext context) {
context.setMixInAnnotations(Person.class, UnwrappedAddresses.class);
}
});
这种方法不会将 Household 序列化更改为单个项目,而只是在封装在 Person 对象中时解开家庭项目。
2. 注释
只需将@JsonUnwrapped添加到您的 getHouseHold() 方法中。
编辑:发布更改后。
你想要的基本上是改变json的输出,这可以通过使用@JsonAnyGetter
注释来完成(它可以动态地向你的pojo添加新属性)。
您可以通过忽略家庭财产并在@JsonAnyGetter 的帮助下打开它来实现您的预期结果。
@JsonIgnoreProperties("houseHold")
public static class Person {
String name;
Household houseHold;
@JsonAnyGetter
public Map<String,Object> properties(){
Map<String,Object> additionalProps=new HashMap<>();
additionalProps.put("addresses", new ArrayList<>(houseHold.getAddresses()));
Map<String,Object> houseHolProps=new HashMap<>();
houseHolProps.put("houseHoldId", houseHold.id);
additionalProps.put("houseHold", houseHolProps);
return additionalProps;
}
..getters&setters omitted
}
序列化后返回
{"name":"name",
"houseHold":{"houseHoldId":0},
"addresses":[
{"houseNo":2,"street":"abc"},
{"houseNo":1,"street":"str"}
]
}