首页 > 解决方案 > 如何为复杂对象创建不同的 JSON 输出

问题描述

我想根据用例为同一个复杂的 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。

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

class Employee {
    private Long id;
    private String name;

    @JsonAllFields
    private EmployeeDetail detail;

    @JsonIdOnly
    private Department department;
    ...
}

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

标签: javajsonjacksongson

解决方案


刚刚找到了一个解决方案@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());

推荐阅读