【问题标题】:Unwrap only some properties with Jackson只用杰克逊解开一些属性
【发布时间】:2017-05-05 21:38:33
【问题描述】:

假设我有这个对象:

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

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

通常会如下序列化

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

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

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

【问题讨论】:

    标签: jackson jackson2


    【解决方案1】:

    您可以通过使用 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"}
      ]
     }
    

    【讨论】:

    • 感谢您的回答,我指定了我的问题。我只想为家庭的财产地址使用@JsonUnwrapped,但我不想为家庭对象的其他财产这样做。
    • 是的,我看到了你的编辑。这是一个完全不同的要求。
    • 目前,我在 JSON 序列化之前使用 DTO。也许唯一的其他方法是实现自定义序列化程序。
    • 看看新的变化,如果他们解决了问题,请告诉我。是的,还有自定义序列化程序的选项,代码库类似于我的 properties() 方法。
    猜你喜欢
    • 2017-09-03
    • 2018-06-21
    • 1970-01-01
    • 2023-04-10
    • 2016-05-04
    • 2018-02-01
    • 2014-08-22
    • 2019-11-25
    • 2014-06-17
    相关资源
    最近更新 更多