今天遇到一个问题,自定义的对象中有整型类型,而这个整型类型是自定义的,继承了Integer,如下所示:
Person.java
package com.xxx.huali.hualitest.json;
public class Person {
public ID id;
public String name;
public Person child;
public Person() {
}
public Person(ID id,String name) {
this.id = id;
this.name = name;
}
public Person(ID id,String name,Person child) {
this(id, name);
this.child = child;
}
}
ID.java
package com.xxx.huali.hualitest.json;
public class ID {
public Integer value ;
public ID() {
}
public ID(int value) {
this.value = value;
}
@Override
public String toString() {
return ""+value;
}
}
JsonTest.java
package com.xxx.huali.hualitest.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.ValueFilter;
public class JsonTest {
public static void main(String[] args) {
Person child = new Person(new ID(1),"xxx");
Person person = new Person(new ID(2),"xxx2",child);
/*
ValueFilter filter = new ValueFilter() {
@Override
public Object process(Object object, String name, Object value) {
try {
return Integer.parseInt(value+"");
} catch (Exception e) {
return value;
}
}
};*/
System.out.println(JSON.toJSONString(person));
}
}
默认情况下,运行代码,打印的对象如下所示:
{"child":{"id":{"value":1},"name":"xxx"},"id":{"value":2},"name":"xxx2"}
这里有个问题,就是id类型,虽然是自定义的,但是我们仍然希望他显示的时候,直接就是id:1,而不是id:{value:1}这种嵌套的形式,fastjson提供了SerializeFilter接口。
我们这里是需要修改json中的值,这里可以自定义ValueFilter,可以实现process方法来做修改达到目的。如题所示,将JSONTest.java类中注释的filter部分的注释去掉,再调用JSON.toJSONString(person,filter)方法的时候,传入filter参数,就可以看效果了:
{"child":{"id":1,"name":"xxx"},"id":2,"name":"xxx2"}
这里的修改方法做了一个取巧的办法,就是能转换成整数的,直接返回整数,否则,原样返回,这样不会影响别的value。