Fastjson - 自定义过滤器(PropertyPreFilter)
1. 需求JSON 数据格式如下,需要过滤掉其中 "book" 的 "price" 属性。 JSON数据格式: { "store": { "book": [ { "category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95 },{ "category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99 } ],"bicycle": { "color": "red","price": 19.95 } },"expensive": 10 } 2. SimplePropertyPreFilter 过滤器该过滤器由Fastjson 提供,代码实现: String json = "{"store":{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}],"bicycle":{"color":"red","price":19.95}},"expensive":10}"; SimplePropertyPreFilter filter = new SimplePropertyPreFilter(); filter.getExcludes().add("price"); JSONObject jsonObject = JSON.parSEObject(json); String str = JSON.toJSONString(jsonObject,filter); System.out.println(str); 运行结果: { "store": { "bicycle": { "color": "red" },"book": [ { "author": "Nigel Rees","category": "reference","title": "Sayings of the Century" },{ "author": "Evelyn Waugh","category": "fiction","title": "Sword of Honour" } ] },"expensive": 10 } 查看 JSON 数据的过滤结果,发现 "bicycle" 中的 "price" 属性也被过滤掉了,不符合需求。 3. LevelPropertyPreFilter 过滤器该自定义过滤器实现 PropertyPreFilter 接口,实现根据层级过滤 JSON 数据中的属性。 /** * 层级属性删除 * * @author yinjianwei * @date 2017年8月24日 下午3:55:19 * */ public class LevelPropertyPreFilter implements PropertyPreFilter { private final Class<?> clazz; private final Set<String> includes = new HashSet<String>(); private final Set<String> excludes = new HashSet<String>(); private int maxLevel = 0; public LevelPropertyPreFilter(String... properties) { this(null,properties); } public LevelPropertyPreFilter(Class<?> clazz,String... properties) { super(); this.clazz = clazz; for (String item : properties) { if (item != null) { this.includes.add(item); } } } public LevelPropertyPreFilter addExcludes(String... filters) { for (int i = 0; i < filters.length; i++) { this.getExcludes().add(filters[i]); } return this; } public LevelPropertyPreFilter addIncludes(String... filters) { for (int i = 0; i < filters.length; i++) { this.getIncludes().add(filters[i]); } return this; } public boolean apply(JSONSerializer serializer,Object source,String name) { if (source == null) { return true; } if (clazz != null && !clazz.isInstance(source)) { return true; } // 过滤带层级属性(store.book.price) SerialContext serialContext = serializer.getContext(); String levelName = serialContext.toString(); levelName = levelName + "." + name; levelName = levelName.replace("$.",""); levelName = levelName.replaceAll("[d+]",""); if (this.excludes.contains(levelName)) { return false; } if (maxLevel > 0) { int level = 0; SerialContext context = serializer.getContext(); while (context != null) { level++; if (level > maxLevel) { return false; } context = context.parent; } } if (includes.size() == 0 || includes.contains(name)) { return true; } return false; } public int getMaxLevel() { return maxLevel; } public void setMaxLevel(int maxLevel) { this.maxLevel = maxLevel; } public Class<?> getClazz() { return clazz; } public Set<String> getIncludes() { return includes; } public Set<String> getExcludes() { return excludes; } } 代码实现: public static void main(String[] args) { String json = "{"store":{"book":[{"category":"reference","expensive":10}"; JSONObject jsonObj = JSON.parSEObject(json); LevelPropertyPreFilter propertyPreFilter = new LevelPropertyPreFilter(); propertyPreFilter.addExcludes("store.book.price"); String json2 = JSON.toJSONString(jsonObj,propertyPreFilter); System.out.println(json2); } 运行结果: { "store": { "bicycle": { "color": "red","price": 19.95 },"expensive": 10 } 查看 JSON 数据的过滤结果,实现了上面的需求。 参考:http://www.cnblogs.com/dirgo/... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |