1. 程式人生 > >Jackson 動態過濾屬性

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.     public String getName() {  
  6.         return name;  
  7.     }  
  8.     public void setName(String name) {  
  9.         this.name = name;  
  10.     }  
  11.     public Date getCreateDate() {  
  12.         return createDate;  
  13.     }  
  14.     public void setCreateDate(Date createDate) {  
  15.         this.createDate = createDate;  
  16.     }  
  17.     public Set<Article> getArticles() {  
  18.         return articles;  
  19.     }  
  20.     public void setArticles(Set<Article> articles) {  
  21.         this.articles = articles;  
  22.     }  
  23. }  
Java程式碼  
  1. public class Article {  
  2.     private String title;  
  3.     private User user;  
  4.     public String getTitle() {  
  5.         return title;  
  6.     }  
  7.     public
     void setTitle(String title) {  
  8.         this.title = title;  
  9.     }  
  10.     public User getUser() {  
  11.         return user;  
  12.     }  
  13.     public void setUser(User user) {  
  14.         this.user = user;  
  15.     }  
  16. }  

然後自己寫的一個Jackson實用類

Java程式碼  
  1. public class Jacksons {  
  2.     private ObjectMapper objectMapper;  
  3.     public static Jacksons me() {  
  4.         return new Jacksons();  
  5.     }  
  6.     private Jacksons() {  
  7.         objectMapper = new ObjectMapper();  
  8.         // 設定輸入時忽略在JSON字串中存在但Java物件實際沒有的屬性  
  9.         objectMapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);  
  10.         objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);  
  11.         objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));  
  12.     }  
  13.     public Jacksons filter(String filterName, String... properties) {  
  14.         FilterProvider filterProvider = new SimpleFilterProvider().addFilter(filterName,  
  15.                 SimpleBeanPropertyFilter.serializeAllExcept(properties));  
  16.         objectMapper.setFilters(filterProvider);  
  17.         return this;  
  18.     }  
  19.     public Jacksons addMixInAnnotations(Class<?> target, Class<?> mixinSource) {  
  20.         objectMapper.getSerializationConfig().addMixInAnnotations(target, mixinSource);  
  21.         objectMapper.getDeserializationConfig().addMixInAnnotations(target, mixinSource);  
  22.         return this;  
  23.     }  
  24.     public Jacksons setDateFormate(DateFormat dateFormat) {  
  25.         objectMapper.setDateFormat(dateFormat);  
  26.         return this;  
  27.     }  
  28.     public <T> T json2Obj(String json, Class<T> clazz) {  
  29.         try {  
  30.             return objectMapper.readValue(json, clazz);  
  31.         } catch (Exception e) {  
  32.             e.printStackTrace();  
  33.             throw new RuntimeException("解析json錯誤");  
  34.         }  
  35.     }  
  36.     public String readAsString(Object obj) {  
  37.         try {  
  38.             return objectMapper.writeValueAsString(obj);  
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.             throw new RuntimeException("解析物件錯誤");  
  42.         }  
  43.     }  
  44.     @SuppressWarnings("unchecked")  
  45.     public List<Map<String, Object>> json2List(String json) {  
  46.         try {  
  47.             return objectMapper.readValue(json, List.class);  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.             throw new RuntimeException("解析json錯誤");  
  51.         }  
  52.     }  
  53. }  

最後是測試:

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.         String userJson = Jacksons.me().readAsString(user);  
  12.         String articleJson = Jacksons.me().readAsString(article);  
  13.         System.out.println(userJson);  
  14.         System.out.println(articleJson);  
  15.     }  
  16. }  

1.父子關係引用

直接輸出肯定是報迴圈錯誤,Jackson 提供了兩個註解

@JsonManagedReference

public Set<Article> getArticles() {

return articles;

}

@JsonBackReference

public User getUser() {

returnuser;

}

列印結果為:{"name":"chris","createDate":"2012-04-18","articles":[{"title":"title"}]}, {"title":"title"}

[email protected]註解

只說父子引用關係的。父子兩邊都加@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() {

returnuser;

}

列印結果:

{"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);

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

寫的有點亂,沒排好版。大家湊和這看吧。

相關推薦

Jackson 動態過濾屬性

用到的類庫為:Jackson 版本1.9.5, 最近在看Google guava,所以用上了,版本是12.0-rc1 廢話不多說,定義兩個Bean 先 這兩個bean 是父子關係。 Java程式碼   public class User {       private String name;  

json-lib過濾屬性

tor ons lean beanutils ddr getaddr nbsp rri apply 依賴jar: commons-beanutils-1.9.3.jar? commons-collections-3.1.jar commons-lang-2.4.jar co

Newtonsoft.Json輸出Json時動態忽略屬性

reat serializa ont 需求 我們 pri ret prot com 一,前言   最近做項目采用Json形式和其他客戶端交互,借助於Newtonsoft.Json 。   由於業務場景不同,輸出的Json內容也不同。要想忽略的屬性,可以借助Newtons

php 給對象動態增加屬性

() isp start ati 增加 word obj sta art <?php error_reporting(-1); ini_set(‘display_errors‘,‘on‘); class A { public $a =

shiro 過濾屬性的意義

perm resource authorize eve string host jsp 根據 默認 今天配置shiro以後css樣式失效了,查了一下配置一下匿名權限就好 如下 shiro.xml <property name="filterChain

shiro過濾器過濾屬性含義

ins 登錄頁面 https log basic認證 zed 端口 使用 頁面 securityManager:這個屬性是必須的。 loginUrl :沒有登錄的用戶請求需要登錄的頁面時自動跳轉到登錄頁面,不是必須的屬性,不輸入地址的話會自動尋找項目web項目的根目錄下的”

Java動態生成類以及動態新增屬性

  有個技術實現需求:動態生成類,其中類中的屬性來自引數物件中的全部屬性以及來自引數物件propertities檔案。   那麼技術實現支援:使用cglib代理。   具體的實現步驟:   1.cglib的jar包(cgl

Python-動態新增屬性和方法

class Person():   Country='CN'   def __init__(self,nm)     self.nm=nm 動態新增例項屬性及例項方法: p=Person() p.age=18 #直接賦值,動態新增例項屬性 def set_age(self,age) #定義帶se

Vue 資料動態過濾實踐

問題是這樣的:頁面從後臺拿到的資料是由0、1之類的key,而這個key代表的value比如0-女、1-男的對應關係是要從另外一個數據字典介面拿到的;類似於這樣的Api:   {   "SEX_TYPE": [   

easyui 如何為標籤動態追加屬性實現渲染效果

簡述一下在專案遇到的問題,這邊有一個需求,選擇不同型別,載入不同的div標籤(其中屬性是否必填是區分型別的關鍵) html介面是這樣的 <div class="grid_1 lbl">規則型別:</div> <div class="grid_3 val"><

2012-6 筆記--動態獲取屬性名,構造json結構

沙盒中圖片,檔案如果沒有,可以重新載入圖片來解決 2012-06-21 10:30:15.189 contacts[30222:9203] m_intv Ti,N,Vm_intv 2012-06-21 10:30:15.190 contacts

vue 動態新增屬性

Vue.set 方法用於設定物件的屬性,它可以解決 Vue 無法檢測新增屬性的限制,語法格式如下: Vue.set( target, key, value ) 引數說明: target: 可以是物件或陣列 key : 可以是字串或數字 value: 可以是任何型別

python的動態新增屬性和方法

import types    如果一個類已經寫好  要想動態的新增一新的方法  那麼需要用下面方法: p1.eat = types.MethodType(eat,p1)    //即把eat函式動態繫結到了p1物件上

jackson序列化 屬性 get 欄位不對應

在jackson序列化物件時,由於其在原始碼中增加了一個可見性判斷,會預設只序列化public修飾的欄位和方法,造成一個可能存在的問題是你欄位明明是CId,但是自動生成的get方法是getCId的話,jackson會將欄位序列化成cid,造成一個反序列失敗的問題(2.0.2到最新2.9.6版本測試)

python基礎之動態新增屬性和方法

一、新增物件屬性: >>> class student(object): pass >>> stu=student() >>> stu.name="zhang jie" #新增物件屬性 >>> stu.name 'zh

js為Object物件動態新增屬性和值

為Object物件動態新增屬性和值 方式1: var obj = {}; //或者 var obj=new Object(); var key = "name"; var value = "張三丰" obj[key] = value; console.info(obj); 方式2,

Vue專案資料動態過濾實踐

這個問題是在下在做一個Vue專案中遇到的實際場景,這裡記錄一下我遇到問題之後的思考和最後怎麼解決的(老年程式設計師記性不好 -。-),過程中會涉及到一些Vue原始碼的概念比如$mount、render watcher等,如果不太瞭解的話可以瞅瞅 Vue原始碼閱讀系列文章 ~ 問

js物件動態新增屬性,方法

1. 動態新增屬性,方法 var object = new Object(); object.name = "name"; object.age = 19; >>>{name: "name", age: 19} object.fun = function(){   console

Java 類動態新增屬性欄位

說明:做專案中遇到一種場景,需要根據查詢時間段, 獲取時間段中中每個月份對應的金額(費用統計)。如截圖中的兩列 因為列是動態的, 首先想到的就是後天拼接JSON格式字串, 然後返回到前臺, 組裝表頭及內容。 但是當前系統中easyUI版本為1.2,並不支援 data屬性(官

下拉表關聯非同步載入不是事兒 - 引數動態過濾

對於報表,簡單來說就是用表格、圖表等格式來動態顯示資料以及資料之間的關係,同時,經常伴隨的,也是很重要的一個功能就是給報表增加各種條件,對資料進行篩選,以便找出使用者最關心的資料。 篩選條件常常不止一項,也就是我們常說的多條件查詢,同時這些條件之間可能還有關聯關係,比如最常見的“省份”和“城市”