Jackson 过滤属性
jackson过滤属性分为静态和动态两种。
静态如下:
定义两个Bean 先,这两个bean 是父子关系。
- public class User {
- private String name;
- private Date createDate;
- private Set<Article> articles = Sets.newHashSet();
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Date getCreateDate() {
- return createDate;
- }
- public void setCreateDate(Date createDate) {
- this.createDate = createDate;
- }
- public Set<Article> getArticles() {
- return articles;
- }
- public void setArticles(Set<Article> articles) {
- this.articles = articles;
- }
- }
- public class Article {
- private String title;
- private User user;
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
然后自己写的一个Jackson实用类
- public class Jacksons {
- private ObjectMapper objectMapper;
- public static Jacksons me() {
- return new Jacksons();
- }
- private Jacksons() {
- objectMapper = new ObjectMapper();
- // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
- objectMapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
- objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
- objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
- }
- public Jacksons filter(String filterName, String... properties) {
- FilterProvider filterProvider = new SimpleFilterProvider().addFilter(filterName,
- SimpleBeanPropertyFilter.serializeAllExcept(properties));
- objectMapper.setFilters(filterProvider);
- return this;
- }
- public Jacksons addMixInAnnotations(Class<?> target, Class<?> mixinSource) {
- objectMapper.getSerializationConfig().addMixInAnnotations(target, mixinSource);
- objectMapper.getDeserializationConfig().addMixInAnnotations(target, mixinSource);
- return this;
- }
- public Jacksons setDateFormate(DateFormat dateFormat) {
- objectMapper.setDateFormat(dateFormat);
- return this;
- }
- public <T> T json2Obj(String json, Class<T> clazz) {
- try {
- return objectMapper.readValue(json, clazz);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("解析json错误");
- }
- }
- public String readAsString(Object obj) {
- try {
- return objectMapper.writeValueAsString(obj);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("解析对象错误");
- }
- }
- @SuppressWarnings("unchecked")
- public List<Map<String, Object>> json2List(String json) {
- try {
- return objectMapper.readValue(json, List.class);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("解析json错误");
- }
- }
- }
最后是测试:
- public class Test {
- public static void main(String args[]) {
- User user = new User();
- user.setName("chris");
- user.setCreateDate(new Date());
- Article article = new Article();
- article.setTitle("title");
- article.setUser(user);
- Set<Article> articles = Sets.newHashSet(article);
- user.setArticles(articles);
- String userJson = Jacksons.me().readAsString(user);
- String articleJson = Jacksons.me().readAsString(article);
- System.out.println(userJson);
- System.out.println(articleJson);
- }
- }
1.父子关系引用
直接输出肯定是报循环错误,Jackson 提供了两个注解
@JsonManagedReference
public Set<Article> getArticles() {
return articles;
}
@JsonBackReference
public User getUser() {
return user;
}
打印结果为:{"name":"chris","createDate":"2012-04-18","articles":[{"title":"title"}]}, {"title":"title"}
2.@JsonIgnore注解
只说父子引用关系的。父子两边都加@JsonIgnore打印字符串为:
{"name":"chris","createDate":"2012-04-18"},{"title":"title"}
单向User加该注解
@JsonIgnore
public Set<Article> getArticles() {
return articles;
}
打印结果为:
{"name":"chris","createDate":"2012-04-18"}
{"title":"title","user":{"name":"chris","createDate":"2012-04-18"}}
单向Article 加该注解
@JsonIgnore
public User getUser() {
return user;
}
打印结果:
{"name":"chris","createDate":"2012-04-18","articles":[{"title":"title"}]}
{"title":"title"}
3.@JsonIgnoreType(没用过)
4.@JsonIgnoreProperties
这个加在类级别上, 用法很简单@JsonIgnoreProperties({"property1", "property2"})
动态过滤属性:
这个比较麻烦方法如下(有如下两种方法):
1.使用@JsonFilter注解
使用方法为先给ObjectMapper添加一个filter,然后还要在需要过滤的类上加@JsonFilter("filterName")注解。
比如说要过滤User 上的name属性,先
Jacksons.me().filter("myFilter", "name").readAsString(user),具体看Jacksons代码。并在User类上加@JsonFilter("myFilter")。
有点不爽的是如果用另外一个没有添加该filter的ObjectMapper解析的话会报错。
如果这个User类已经添加了@JsonFilter("myFilter")注解,但在另外一个地方又要解析它并不想过滤name 属性,那只能是
Jacksons.me().filter("myFilter", ""),然后在读出来。
如果要过滤多个属性可以如下:
Set<String> rolePros = new HashSet<String>();
rolePros.add("rank");
rolePros.add("areaId");
rolePros.add("areaName");
rolePros.add("areaCode");
Set<String> titleFilter = new HashSet<String>();
titleFilter.add("status");
titleFilter.add("ottVisible");
titleFilter.add("dvbVisible");
titleFilter.add("roleRelationList");
objectMapper = new ObjectMapper();
FilterProvider filterProvider = new SimpleFilterProvider().
addFilter("RoleFilter",SimpleBeanPropertyFilter.serializeAllExcept(rolePros)).
addFilter("TitleFilter", SimpleBeanPropertyFilter.serializeAllExcept(titleFilter));
objectMapper.setFilters(filterProvider);
写完这个后,还需要在需过滤的Bean上加@JsonFilter(filterName),
2.添加混入注解(暂时这么翻译)
定义一个接口或类先, 在该类上添加@JsonIgnoreProperties("name"), 然后在ObjectMapper的配置项上添加混入注解
输出为:
String mixInUser = Jacksons.me().addMixInAnnotations(User.class, MixInUser.class).readAsString(user);
System.out.println(mixInUser);
Jackson 过滤属性的更多相关文章
- (转)DataRow的各种状态和DataView的两种过滤属性
DataRow的各种状态 http://www.cnblogs.com/zxjyuan/archive/2008/08/20/1271987.html 一个DataRow对象刚被创建之后(DataTa ...
- Jackson 动态过滤属性,编程式过滤对象中的属性
场景:有时候我们做系统的时候,比如两个请求,返回同一个对象,但是需要的返回字段并不相同. 常见与写前端接口的时候,尤其是手机端,一般需要什么数据就返回什么样的数据.此时对于返回同一个对象我们就要动态过 ...
- java spring使用Jackson过滤
一.问题的提出. 项目使用Spring MVC框架,并用jackson库处理JSON和POJO的转换.在POJO转化成JSON时,希望动态的过滤掉对象的某些属性.所谓动态,是指的运行时,不同的cont ...
- C#在数据层过滤属性中的主键
C#使用泛型+反射做为数据层时,一个很都头疼的问题,如何让C#属性在程序里识别出哪个属性是主键,在拼接SQL时,不能把主键拼接到SQL语句里. 这个需要自定义一个属性.新建一个类文件,命名为Prosp ...
- shiro过滤器过滤属性含义
securityManager:这个属性是必须的. loginUrl :没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/lo ...
- Maven过滤属性文件,替换属性值
pom.xml 1.resources: resources中是定义哪些目录下的文件会被配置文件中定义的变量替换,一般我们会把项目的配置文件放在src/main/resources下,像db,bean ...
- Asp .Net MVC中常用过滤属性类
/// <summary> /// /// </summary> public class AjaxOnlyAttribute : ActionFilterAttribute ...
- C# openfiledialog设置filter属性后达不到过滤效果的原因之一
此处用RichTextBox控件举例>>> 在窗体对应的类中处理Load事件可以为openfiledialog设置Filter的属性: private void Form1_Load ...
- fastjson过滤不需要的属性
以下是一个通用的对象转json的方法,使用的fastjson的SimplePropertyPreFilter 对象,个人感觉比使用PropertyPreFilter的匿名内部类形式的过滤器更好用!直接 ...
随机推荐
- Spark底层原理简化版
目录 Spark SQL/DF的执行过程 集群运行部分 Aggregation Join Shuffle Tungsten 内存管理机制 缓存敏感计算(Cacheaware computation) ...
- 自己对javascript闭包的了解
目录 闭包的概念 谈谈函数执行环境,作用域链以及变量对象 闭包和函数柯里化 闭包造成的额外的内存占用 (注意我说的不是“内存泄漏”!) 闭包只能取得包含函数的最后一个值 正文 前言: 在这篇文章里, ...
- Angular 显示英雄列表
在本页面,你将扩展<英雄指南>应用,让它显示一个英雄列表, 并允许用户选择一个英雄,查看该英雄的详细信息. 创建模拟(mock)英雄数据 你需要一些英雄数据以供显示. 最终,你会从远端的数 ...
- 2015 多校赛 第四场 1009 (hdu 5335)
Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit) ...
- HBase与RDBMS的区别
此讨论并不局限于HBase,也会延伸到MongoDB和Cassandra这样的NoSQL数据库. 1.RDBMS RDBMS有以下特点: 面向视图:RDBMS表使用固定的视图,表中的数据类型也会事先定 ...
- NetCore下获取项目文件路径
我要获取的是doc/FPFile.xml 百度了一大堆就是找不到解决问题. 把属性更改为始终赋值, XmlDocument xdi = new XmlDocument(); xdi.Load((&qu ...
- WPF度量系統
和Winform不同,WPF的度量單位不是像素,而是設備無關單位DIU,其大小總是1/96吋 那麽,WPF中一個寬度爲96的按鈕,到底是多少個像素呢? 答:取決於系統DPI. 計算公式爲:實際像素 = ...
- 1、Scala安装与基础
1.scala与java 2.安装 3.scala编译器 4.变量声明 5.数据类型 6.操作符 7.函数调用 8.apply函数 1.scala与java scala基于java虚拟机,所有scal ...
- DNN结构演进History—CNN-GoogLeNet :Going Deeper with Convolutions
抄袭了一片文章,进行少量修改:http://www.gageet.com/2014/09203.php 作者:Christian Szegedy( google ) 刘伟(北卡罗来纳 ...
- c#如何用代码开启cmd指定命令(如:运行一个手机adb shell命令)
else if (this.Mode == TravelMode.AutoRecodeMode) { DateTime StartDate = DateTime.Now; string args = ...