日期:2014-05-16  浏览次数:20397 次

json-lib 之jsonConfig详细使用(转)

一,setCycleDetectionStrategy 防止自包含

 /**
     * 这里测试如果含有自包含的时候需要CycleDetectionStrategy
     */
    public static void testCycleObject() {
        CycleObject object = new CycleObject();
        object.setMemberId("yajuntest");
        object.setSex("male");
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

        JSONObject json = JSONObject.fromObject(object, jsonConfig);
        System.out.println(json);
    }

    public static void main(String[] args) {
               JsonTest.testCycleObject();
    }

?其中 CycleObject.java是我自己写的一个类:

public class CycleObject {

    private String      memberId;
    private String      sex;
    private CycleObject me = this;
…… // getters && setters
}

?

二,setExcludes:排除需要序列化成json的属性

 public static void testExcludeProperites() {
        String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setExcludes(new String[] { "double", "boolean" });
        JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON(str, jsonConfig);
        System.out.println(jsonObject.getString("string"));
        System.out.println(jsonObject.getInt("integer"));
        System.out.println(jsonObject.has("double"));
        System.out.println(jsonObject.has("boolean"));
    }

    public static void main(String[] args) {
        JsonTest.testExcludeProperites();
    }

?

三,setIgnoreDefaultExcludes

@SuppressWarnings("unchecked")
	public static void testMap() {
		Map map = new HashMap();
		map.put("name", "json");
		map.put("class", "ddd");
		JsonConfig config = new JsonConfig();
		config.setIgnoreDefaultExcludes(true);  //默认为false,即过滤默认的key
		JSONObject jsonObject = JSONObject.fromObject(map,config);
		System.out.println(jsonObject);
		
	}

?

上面的代码会把name 和 class都输出。

而去掉setIgnoreDefaultExcludes(true)的话,就只会输出name,不会输出class。

   private static final String[] DEFAULT_EXCLUDES = new String[] { "class", "declaringClass",
         "metaClass" }; // 默认会过滤的几个key

?

四,registerJsonBeanProcessor 当value类型是从java的一个bean转化过来的时候,可以提供自定义处理器

?

?

	public static void testMap() {
		Map map = new HashMap();
		map.put("name", "json");
		map.put("class", "ddd");
		map.put("date", new Date());
		JsonConfig config = new JsonConfig();
		config.setIgnoreDefaultExcludes(false);
		config.registerJsonBeanProcessor(Date.class,
				new JsDateJsonBeanProcessor()); // 当输出时间格式时,采用和JS兼容的格式输出
		JSONObject jsonObject = JSONObject.fromObject(map, config);
		System.out.println(jsonObject);
	}

?

?注:JsDateJsonBeanProcessor 是json-lib已经提供的类,我们也可以实现自己的JsonBeanProcessor。

五,registerJsonValueProcessor

?

六,registerDefaultValueProcessor

?

为了演示,首先我自己实现了两个?Processor

一个针对Integer

?

public class MyDefaultIntegerValueProcessor implements DefaultValueProcessor {

	public Object getDefaultValue(Class type) {
		if (type != null && Integer.class.isAssignableFrom(type)) {
			return Integer.valueOf(9999);
		}
		return JSONNull.getInstance();
	}

}

?

一个针对PlainObject(我自定义的类)

public class MyPlainObjectProcessor implements DefaultValueProcessor {

	public Object getDefaultValue(Class type) {
		if (type != null && PlainObject.class.isAssignableFrom(type)) {
			return "美女" + "瑶瑶";
		}
		return JSONNull.getInstance();
	}
}

?

以上两个类用于处理当value为null的时候该如何输出。

?

还准备了两个普通的自定义bean

PlainObjectHolder:

?

public class PlainObjectHolder {

	private PlainObj