fastjson,一行代码实现自定义过滤某些属性,通用方法


声明:本文转载自https://my.oschina.net/u/3455207/blog/1615375,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

最近几个项目都用的fastjson,前阵子遇到这个问题的时候我本以为是非常简单,百度一下几秒钟的事。结果网上的答案是真TM的坑,要么文不对题,要么根本就是错的,而且还抄来抄去。坑了我几个小时。现在记下来一是以后忘了回来看下,二是让后来者少走弯路,希望他们能早点看到这片文章把。

那些坑人的垃圾文章有如下几个特征:

  • 只能过滤某个属性,覆盖apply方法(说好的过滤某些呢?)
  • 上者的加强版,多个或条件(一点都不通用啊)
  • 实际上是保留属性(反向操作?)
  • 循环remove(这么生硬?)
  • 不想要的字段上用注解@JSONFiled(serialize=false)(这个还算是靠谱的答案了,但有的团队要求model尽量纯净不被注解侵入;或者是这个java bean是在别处定义的你无法接触到,就行不通。PS:此处不扯DTO、DO、VO、XXOO的问题)
  • 低版本

随便在网上搜搜看,很多文章都是这样而且高度相似的。我想要的是一个自由的、不依赖注解的、通用的、不侵入的、自定义的解决方案。方法如下:

1. 先定义个bean:

public class Person {     private String name;     private String sex;     private int age;     private Person father;      public Person() {     }     public Person(String name, String sex, int age) {         this.name = name;         this.sex = sex;         this.age = age;     }     //省略getter和setter }

注意:序列化的bean类需要有默认的无参构造函数,否则fastjson在使用反射的时候会报错。

2. 通用方法:

private static JSON toJson(Object o, String... excludeKeys) {     List<String> excludes = Arrays.asList(excludeKeys);     SimplePropertyPreFilter filter = new SimplePropertyPreFilter();     filter.getExcludes().addAll(excludes);    //重点!!!     return JSON.parseObject(JSON.toJSONString(o, filter)); }

String... 可以方便的自定义你想要过滤的属性

3. 示例:

public static void main(String[] args) {     Person child = new Person("mike", "male", 10);     Person father = new Person("jimmy", "male", 37);     child.setFather(father);     JSON json  = toJson(child, "name", "age");     System.out.println(json); }

4. 结果:

{"father":{"sex":"male"},"sex":"male"}

可以看到成功过滤了某些属性,而且连引用对象的相关属性也过滤掉了,实现了深层过滤

本文发表于2018年01月30日 14:31
(c)注:本文转载自https://my.oschina.net/u/3455207/blog/1615375,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2649 讨论 0 喜欢 1

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1