`

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

 

分享到:
评论

相关推荐

    jackson工具类有动态属性过虑功能

    jackson工具类有动态属性过虑功能.在业务应用中经常会有指定属性序列化json的需求,

    jackson-dynamic-filter:一种使用Jackson来动态确定过滤器的简便方法

    杰克逊动态属性过滤器基本上,当您使用Gson时,需要从目标对象上的序列化WITHOUT批注中排除特定字段,您将使用ExclusionStrategy 。 但是我在杰克逊没有找到类似的方法来做到这一点。 因此,此存储库提供了一种动态...

    jackson-dynamic-filter-spring-boot-starter:使用Jackson轻松动态确定过滤器的简便方法

    Jackson动态属性过滤器-Spring Boot Starter 用于Spring Boot Starter,它提供了一种简便的方法,可以通过动态确定过滤,而无需直接在Java对象上编写注释,并且还可以与Spring MVC / Spring Boot很好地集成。 先决...

    自定义JSONObject属性过滤注解

    `@JsonIgnore`是Jackson库提供的一种标准方式来过滤属性,但有时候我们可能需要更精细的控制,比如根据特定条件决定是否忽略某个属性。这时,自定义注解就显得尤为重要。 首先,我们需要创建一个自定义注解,例如...

    jackson2.7.8

    Jackson还支持更高级的功能,如处理复杂类型(如嵌套对象、集合、泛型),处理日期和时间,自定义序列化和反序列化逻辑,以及使用`JsonView`进行数据过滤等。此外,对于大型项目,可以通过配置`ObjectMapper`实例来...

    jackson所需jar包

    - **POJO(Plain Old Java Object)映射**:Jackson可以直接将JSON映射到Java类的实例上,无需额外的配置,只要类的属性和JSON键匹配即可。 - **数据过滤和忽略**:通过注解如`@JsonIgnore`,可以控制哪些字段不参与...

    Json字段过滤器

    通过这种方式,我们实现了通过自定义注解动态过滤JSON字段的功能,使得后端开发人员能够更灵活地控制返回给客户端的数据,提高系统的安全性。这种技术尤其适用于那些具有大量API且需要对返回数据进行精细控制的项目...

    Java_squigly Filter是一个Jackson JSON PropertyFilter,它使用Facebo.zip

    这种语法使得过滤规则易于理解和实现,特别适合于动态或者条件性的属性筛选。 在实际使用中,你需要首先在项目中引入Jackson库和Java_squigly Filter的相关依赖。接着,你可以创建一个`SimpleBeanPropertyFilter`...

    springMVC4-rest-jackson-jsonview-annotation.zip

    我们的POJO使用@JsonView注解属性传递已经定义的视图。在Spring的Controller我们可以使用Jackson的@JsonView注解我们的方法。序列化Http响应体的时候,JSON响应将在配置视图的基础上进行过滤。我们也可以在Spring ...

    jackson-jaxrs-propertyfiltering

    杰克逊·贾克斯(Jackson-Jaxrs)属性过滤 概述 用于启用自动过滤来自JAX-RS端点的JSON响应的库。 客户端通过查询参数指定他们想要的属性,并且库负责将响应实体过滤为仅这些属性(请参见的示例)。 经过Jersey测试...

    完整jersey包和jackson-all-1.9.2.jar

    5. **配置选项**:Jackson提供了大量配置选项,例如日期格式化、自定义序列化和反序列化行为、忽略未知属性等。 6. **与其他框架集成**:Jackson可以轻松地与Spring、Hibernate等框架集成,实现JSON数据的自动转换...

    Spring boot中Jackson的操作指南

    @JsonIgnoreProperties 注解用于忽略该字段所包含的全部属性。 7. @JsonInclude 注解 @JsonInclude 注解用于指定该字段的序列化方式。例如,我们可以使用 @JsonInclude(Include.NON_EMPTY) 来指定该字段仅在不为空...

    彻底根治Spring @ResponseBody JavaScript HTML特殊字符

    - 另外,也可以通过全局配置`ObjectMapper`,启用`HtmlEscapingEnabled`属性,使Jackson在序列化时自动转义HTML。 4. **其他解决方案**: - 如果你使用的是Thymeleaf等模板引擎,它们通常会自动转义输出内容,...

    JSON序列化和反序列化.docx

    在这个文档中,我们将重点讨论三个关键注解:`@JsonIgnore`, `@JsonFormat`, 和 `@JsonProperty`,以及如何使用 `JsonFilter` 实现动态数据列过滤。 `@JsonIgnore` 是一个非常实用的注解,当它被应用于一个属性上时...

    JSON死循环解决办法

    `JsonConfig`是Jackson或Fastjson等库中的配置类,可以通过设置`exclusions`来排除特定属性。例如,将`address`属性加入排除列表,防止在序列化时处理。但要注意,这种方法会全局影响所有包含该属性的类。 3. **...

    struts2框架json传递后台数据到echarts

    可以使用诸如Gson或Jackson这样的库将Java对象转化为JSON字符串。例如: ```java import com.google.gson.Gson; ... public String execute() { List&lt;DataModel&gt; dataList = ...; // 获取数据 Gson gson = new...

    spring-mvc-JsonIgnoreDynamically:渲染前按名称从 jackson json 序列化中排除某些字段

    spring-mvc-Json动态忽略目的 : 有时,过滤序列化到 HTTP 响应主体的上下文对象会很有用。在某些情况下,返回的部分数据可能对使用 API 的设备没有用,或者应该对公众保持不可见,因此不应该t 通过 JSON 序列化和...

    Java安全漫谈 - 07.反序列化篇(1)1

    1. **信任边界**:当系统接收来自不可信源的序列化数据时,如果没有正确的验证和过滤,就可能遭受攻击。 2. **脆弱的自定义序列化**:在`readObject`方法中直接执行未经验证的用户输入,可能导致代码执行。 3. **...

    spring boot 下对JSON返回值去除null和空字段操作

    首先,Spring Boot默认使用的JSON库是Jackson,它提供了强大的JSON序列化和反序列化功能。为了去除JSON中的`null`值和空字符串,我们可以通过自定义Jackson配置来实现。以下是一个简单的配置类`JacksonConfig`示例:...

    B站整理的乐优商城笔记

    我们可以使用 Object.keys() 方法来获取对象的所有属性名称,并使用 filter() 方法来过滤对象的属性。 17. 使用StringUtils的方法: 在本节中,我们学习了如何使用StringUtils的方法来实现字符串操作。我们可以...

Global site tag (gtag.js) - Google Analytics