Jackson 动态过滤属性

用到的类库为:Jackson 版本1.9.5, 最近在看Google guava,所以用上了,版本是12.0-rc1

废话不多说,定义两个Bean 

这两个bean 是父子关系。

Java代码   收藏代码
  1. public class User {  
  2.     private String name;  
  3.     private Date createDate;  
  4.     private Set<Article> articles = Sets.newHashSet();  
  5.   
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public Date getCreateDate() {  
  13.         return createDate;  
  14.     }  
  15.     public void setCreateDate(Date createDate) {  
  16.         this.createDate = createDate;  
  17.     }  
  18.     public Set<Article> getArticles() {  
  19.         return articles;  
  20.     }  
  21.     public void setArticles(Set<Article> articles) {  
  22.         this.articles = articles;  
  23.     }  
  24. }  
Java代码   收藏代码
  1. public class Article {  
  2.     private String title;  
  3.     private User user;  
  4.   
  5.     public String getTitle() {  
  6.         return title;  
  7.     }  
  8.     public void setTitle(String title) {  
  9.         this.title = title;  
  10.     }  
  11.     public User getUser() {  
  12.         return user;  
  13.     }  
  14.     public void setUser(User user) {  
  15.         this.user = user;  
  16.     }  
  17. }  

然后自己写的一个Jackson实用类

Java代码   收藏代码
  1. public class Jacksons {  
  2.     private ObjectMapper objectMapper;  
  3.   
  4.     public static Jacksons me() {  
  5.         return new Jacksons();  
  6.     }  
  7.   
  8.     private Jacksons() {  
  9.         objectMapper = new ObjectMapper();  
  10.         // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性  
  11.         objectMapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);  
  12.         objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);  
  13.   
  14.         objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));  
  15.     }  
  16.   
  17.     public Jacksons filter(String filterName, String... properties) {  
  18.         FilterProvider filterProvider = new SimpleFilterProvider().addFilter(filterName,  
  19.                 SimpleBeanPropertyFilter.serializeAllExcept(properties));  
  20.         objectMapper.setFilters(filterProvider);  
  21.         return this;  
  22.     }  
  23.   
  24.     public Jacksons addMixInAnnotations(Class<?> target, Class<?> mixinSource) {  
  25.         objectMapper.getSerializationConfig().addMixInAnnotations(target, mixinSource);  
  26.         objectMapper.getDeserializationConfig().addMixInAnnotations(target, mixinSource);  
  27.         return this;  
  28.     }  
  29.   
  30.     public Jacksons setDateFormate(DateFormat dateFormat) {  
  31.         objectMapper.setDateFormat(dateFormat);  
  32.         return this;  
  33.     }  
  34.   
  35.     public <T> T json2Obj(String json, Class<T> clazz) {  
  36.         try {  
  37.             return objectMapper.readValue(json, clazz);  
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.             throw new RuntimeException("解析json错误");  
  41.         }  
  42.     }  
  43.   
  44.     public String readAsString(Object obj) {  
  45.         try {  
  46.             return objectMapper.writeValueAsString(obj);  
  47.         } catch (Exception e) {  
  48.             e.printStackTrace();  
  49.             throw new RuntimeException("解析对象错误");  
  50.         }  
  51.     }  
  52.   
  53.     @SuppressWarnings("unchecked")  
  54.     public List<Map<String, Object>> json2List(String json) {  
  55.         try {  
  56.             return objectMapper.readValue(json, List.class);  
  57.         } catch (Exception e) {  
  58.             e.printStackTrace();  
  59.             throw new RuntimeException("解析json错误");  
  60.         }  
  61.     }  
  62. }  

最后是测试:

Java代码   收藏代码
  1. public class Test {  
  2.     public static void main(String args[]) {  
  3.         User user = new User();  
  4.         user.setName("chris");  
  5.         user.setCreateDate(new Date());  
  6.         Article article = new Article();  
  7.         article.setTitle("title");  
  8.         article.setUser(user);  
  9.         Set<Article> articles = Sets.newHashSet(article);  
  10.         user.setArticles(articles);  
  11.           
  12.         String userJson = Jacksons.me().readAsString(user);  
  13.         String articleJson = Jacksons.me().readAsString(article);  
  14.         System.out.println(userJson);  
  15.         System.out.println(articleJson);  
  16.     }  
  17. }  

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"""),然后在读出来。

2.添加混入注解(暂时这么翻译)

 

定义一个接口或类先在该类上添加@JsonIgnoreProperties("name"), 然后在ObjectMapper的配置项上添加混入注解

输出为:

 

String mixInUser = Jacksons.me().addMixInAnnotations(User.class, MixInUser.class).readAsString(user);

System.out.println(mixInUser);

有兴趣的童鞋可以看下例子。

写的有点乱,没排好版。大家凑和这看吧。

 

http://yxb1990.iteye.com/blog/1489712

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jackson与fastjson都是用于处理JSON数据的Java库。它们提供了序列化和反序列化JSON数据的功能。 在序列化方面,这两个库有一些差异。fastjson默认情况下不会序列化null值,也就是说如果一个属性的值是null,在序列化后,该属性将不会出现在JSON字符串中。而jackson则默认会序列化null值,即使属性的值为null,该属性也会在JSON字符串中呈现。 两个库在序列化时也有一些其他的功能配置。例如,fastjson可以通过设置fastjson的序列化过滤器进行定制化处理,还可以美化输出JSON字符串等。而jackson可以全局配置序列化的行为,比如将驼峰命名转换为下划线命名,忽略某些属性的序列化等。 在反序列化方面,fastjsonjackson都提供了相应的功能。它们可以将JSON字符串转化为Java对象。 总结来说,jackson和fastjson都是功能强大的Java库,用于处理JSON数据。它们在序列化和反序列化方面有一些差异,并且提供了不同的配置选项来满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [jackson与fastjson](https://blog.csdn.net/xuxuxux123/article/details/126625323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Jackson、FastJson快速入门(整合SpringMVC)](https://blog.csdn.net/qq_45173404/article/details/108417438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值