Jackson 動態過濾屬性
用到的類庫為:Jackson 版本1.9.5, 最近在看Google guava,所以用上了,版本是12.0-rc1
廢話不多說,定義兩個Bean 先
這兩個bean 是父子關係。
Java程式碼- 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
- this.title = title;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
然後自己寫的一個Jackson實用類
Java程式碼- 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錯誤");
- }
- }
- }
最後是測試:
Java程式碼- 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() {
returnuser;
}
列印結果為:{"name":"chris","createDate":"2012-04-18","articles":[{"title":"title"}]}, {"title":"title"}
只說父子引用關係的。父子兩邊都加@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屬性(官
下拉表關聯非同步載入不是事兒 - 引數動態過濾
對於報表,簡單來說就是用表格、圖表等格式來動態顯示資料以及資料之間的關係,同時,經常伴隨的,也是很重要的一個功能就是給報表增加各種條件,對資料進行篩選,以便找出使用者最關心的資料。 篩選條件常常不止一項,也就是我們常說的多條件查詢,同時這些條件之間可能還有關聯關係,比如最常見的“省份”和“城市”