今天遇到一个问题,自定义的对象中有整型类型,而这个整型类型是自定义的,继承了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。 

03-13 20:18