2

假设我有这个对象:

class Person {
   String name;
   Household getHousehold();
}

class Household {
   Set<Address> getAddresses();
   String householdId;
}

这通常会被序列化如下

{
  "name": "XXX",
  "household": {
    "addresses": [...]
  }
}

有没有办法用注释/混合配置杰克逊来获得这个(即不使用 DTO)?

{
  "name": "XXX",
  "addresses": [...],
  "household": {
    "householdId": 123
  }
}
4

1 回答 1

3

您可以通过使用 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"}
  ]
 }
于 2016-12-20T17:39:16.543 回答