Json-lib(net.sf.json)包,强烈建议不要再使用

最近在使用Json-lib,发现有许多BUG,而且开发者早已不在支持,强烈建议不要再使用此开源包。

  下面就说说我这个case。最近项目需要对外提供一个接口,要求返回的数据是json格式的,但是当某字段无数据时,要求用空字符表示,而不是null。当我发现在从JavaBean转化为JSONObject时,可以给JSONObject.fromObject()方法传一个JsonConfig参数,给JsonConfig添加一个JsonValueProcessor,这样就可以当value为Null时,设置自己想要的值。但是试了好多次,均不能把null转化为空字符,网上也没有这方面的blog,虽看源代码发现如下,
在JSONObject._fromMap方法中有如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if( value != null ){
JsonValueProcessor jsonValueProcessor = jsonConfig.findJsonValueProcessor(
value.getClass(), key );
if( jsonValueProcessor != null ){
value = jsonValueProcessor.processObjectValue( key, value, jsonConfig );
bypass = true;
if( !JsonVerifier.isValidJsonValue( value ) ){
throw new JSONException( "Value is not a valid JSON value. " + value );
}
}
setValue( jsonObject, key, value, value.getClass(), jsonConfig, bypass );
}else{
if( jsonObject.properties.containsKey( key ) ){
jsonObject.accumulate( key, JSONNull.getInstance() );
firePropertySetEvent( key, JSONNull.getInstance(), true, jsonConfig );
}else{
jsonObject.element( key, JSONNull.getInstance() );
firePropertySetEvent( key, JSONNull.getInstance(), false, jsonConfig );
}
}

在上面代码中可以看到,当value为null时,JsonValueProcessor早已不起作用,只有当value不为null时,JsonValueProcessor才起作用。而在setValue( jsonObject, key, value, value.getClass(), jsonConfig, bypass );方法中:

1
2
3
4
5
6
if( value == null ){
value = jsonConfig.findDefaultValueProcessor( type ).getDefaultValue( type );
if( !JsonVerifier.isValidJsonValue( value ) ){
throw new JSONException( "Value is not a valid JSON value. " + value );
}
}

这两段代码明显矛盾,所以说在使用JSONObject.fromObject(Object object, JsonConfig jsonConfig)不能使value的值从null变为空字符。