最近几个项目都用的fastjson,前阵子遇到这个问题的时候我本觉得是很是简单,百度一下几秒钟的事。结果网上的答案是真TM的坑,要么文不对题,要么根本就是错的,并且还抄来抄去。坑了我几个小时。如今记下来一是之后忘了回来看下,二是让后来者少走弯路,但愿他们能早点看到这片文章把。java
那些坑人的垃圾文章有以下几个特征:json
随便在网上搜搜看,不少文章都是这样并且高度类似的。我想要的是一个自由的、不依赖注解的、通用的、不侵入的、自定义的解决方案。方法以下:app
1. 先定义个bean:函数
public class Person implements Serializable{ private static final long serialVersionUID = -2414273235642766924L; 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在使用反射的时候会报错。this
2. 通用方法:code
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. 示例:rem
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. 结果:get
{"father":{"sex":"male"},"sex":"male"}
能够看到成功过滤了某些属性,并且连引用对象的相关属性也过滤掉了,实现了深层过滤。io