【问题标题】:How to create different JSON output for a complex object如何为复杂对象创建不同的 JSON 输出
【发布时间】:2019-09-18 08:25:31
【问题描述】:

我想根据用例为同一个复杂的 Java 对象生成不同的 Json 输出。

例如检查以下代码:

class Employee {
    private Long id;
    private String name;
    private EmployeeDetail detail;
    private Department department;
    ...
}

class Department {
    private Long id;
    private String name;
    private String address;
    ...
}

class EmployeeDetail {
    private Long id;
    private int salary;
    private Date birthDate;
    ...
}

如果我将 Employee 转换为 Json,Employee、EmployeeDetail 和 Department 中的所有字段都将显示。它适用于一个用例。

但是在第二个用例中,我想跳过除 id 字段之外的部门详细信息,但保留完整的 EmployeeDetail。

我知道我可以在Department 类的id 字段中添加类似@JsonView(EmployeeView.Basic.class) 的内容并使用Json 视图。但是,对于更简洁的代码,我想在 Employee 类中解决它,如下所示:

class Employee {
    private Long id;
    private String name;

    @JsonAllFields
    private EmployeeDetail detail;

    @JsonIdOnly
    private Department department;
    ...
}

目前我使用 Jackson 库,但可以根据需要进行切换。

【问题讨论】:

  • 您能否为您需要的每种输出类型创建一个“表示”类,该类在构造函数中接受“根”类(以填充它),但只包含您的 JSON 输出的相关字段?
  • 是的,它可以工作,但我尽量避免这种情况。

标签: java json jackson gson


【解决方案1】:

我认为你可以使用 com.fasterxml.jackson.annotation。

@JsonIgnore 用于忽略序列化和反序列化中使用的逻辑属性。 @JsonIgnore 可用于 setter、getter 或字段。您可以在除 ID 之外的 Department 类的字段中使用它。有很多方法可以做到这一点。您可以允许序列化等中唯一的吸气剂。

例子:

@JsonIgnore(false)
private String id; 

@JsonIgnoreProperties({ "bookName", "bookCategory" })
public class Book {
   @JsonProperty("bookId")
   private String id;

   @JsonProperty("bookName")        
   private String name;

   @JsonProperty("bookCategory")    
   private String category;  

} 

想了解更多,请参考:https://www.concretepage.com/jackson-api/jackson-jsonignore-jsonignoreproperties-and-jsonignoretype

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    刚刚找到使用@JsonFilter的解决方案

    现在 Employee 类看起来像这样:

    class Employee {
        private Long id;
        private String name;
        private EmployeeDetail detail;
    
        @JsonFilter("departmentFilter")
        private Department department;
        ...
    }
    

    生成受限json的代码如下:

    ObjectMapper mapper = new ObjectMapper();
    
    SimpleFilterProvider filterProvider = new SimpleFilterProvider();
    filterProvider.addFilter("departmentFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id"));
    
    mapper.setFilterProvider(filterProvider);
    

    一个小缺点是现在我还需要定义过滤器来生成完整、详细的 json,如下所示:

    filterProvider.addFilter("departmentFilter", SimpleBeanPropertyFilter.serializeAll());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      相关资源
      最近更新 更多