2

我有以下课程 -

员工

公共类员工{

    私人字符串名;
    私人字符串姓氏;
    私人字符串电子邮件地址;
    私人字符串 ssn ;
}

工资单

公共类工资{

    // 不同的工资单相关字段

    私人雇员 emp ;

}

人力资源

公共类人力资源{

    // 不同的 HR 相关字段

    私人雇员 emp ;

}

现在,当我序列化我的 Payroll 类时,我不想从 Employee 类中序列化我的 ssn 字段。

当我序列化我的 HR 类时,我不想从 Employee 类序列化我的 emailAddress 字段。

如何使用 Jackson JSON API 从序列化中动态排除字段?

4

3 回答 3

6

如何使用 Jackson JSON API 从序列化中动态排除字段?

这似乎是应用JacksonJsonViews的主要候选人。

public class Employee {

    private String firstName;
    private String lastName;
    @JsonView(Views.Payroll.class) private String emailAddress; 
    @JsonView(Views.HR.class) private String ssn;
}

public class Payroll {
    // snip

    @JsonView(Views.Payroll.class)
    private Employee emp;
}

public class HR {
    // snip

    @JsonView(Views.HR.class)
    private Employee emp;
}
于 2013-04-02T20:02:18.867 回答
0

我在下面回答以与客户阅读器动态反序列化。序列化时可以与作家做类似的事情以忽略。

Jackson 动态更改 JsonIgnore

于 2021-08-18T19:33:17.597 回答
0

您可以在 JsonFilter 的帮助下实现这一点。

  1. 注释要过滤的类,如下所示:
@JsonFilter("employeeFilter")
public class Employee {

    private String firstName ;
    private String lastName ;
    private String emailAddress ; 
    private String ssn ;
}
  1. 创建一个名为 FilterBeanService 的服务(或其他任何东西)
@Service
public class FilterBeanService {

    // fields is an array of field names you wish not to sned in your response
    // beanFilterName is value you give when you annotage your bean class
    // dataSet is the data you want to filter
    public static MappingJacksonValue filterBean(String[] fields, String beanFilterName, Object dataSet ) {
        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.serializeAllExcept(fields);
        FilterProvider filterProvider = new SimpleFilterProvider().addFilter(beanFilterName, filter);
        MappingJacksonValue jacksonValue = new MappingJacksonValue(dataSet);
        jacksonValue.setFilters(filterProvider);
        return jacksonValue;
    }
}
  1. 在您的控制器中,您可以过滤您不想要的文件
@GetMapping("/whatever")
public ResponseEntity<MappingJacksonValue> getSomething(){
   List<Employee> employees = eventRepo.findAll();
   String[] fields = {"ssn"};
   MappingJacksonValue jacksonValue = FilterBeanService.filterBean(fields, "employeeFilter", employees);
   return jacksonValue;
}
于 2021-09-08T11:16:16.427 回答