概述
这是Json-lib处理机制的第二篇。
这一篇文章主要描述了ProcessorMatcher的实际功能。
希望对大家在使用的过程中有帮助。
抽象类 | 对应的Processor |
---|---|
DefaultValueProcessorMatcher | DefaultValueProcessor |
JsonBeanProcessorMatcher | JsonBeanProcessor |
JsonValueProcessorMatcher | JsonValueProcessor |
PropertyNameProcessorMatcher | PropertyNameProcessor |
我们就对应第一篇相关的内容来实验一下这些Matcher的功效!
DefaultValueProcessorMatcher
JavaDoc描述:
Base class for finding a matching DefaultValueProcessor.
/**
*
* @author Administrator
*
*/
public class DefaultValueDateMatcher extends DefaultValueProcessorMatcher {
@SuppressWarnings("rawtypes")
@Override
public Object getMatch(Class arg0, Set arg1) {
System.out.println("class==="+arg0.getName());
//如果是日期类型
if(arg0==Date.class)
{
return MyObject.class;
}
else
{
return arg0;
}
}
public static void main(String[] args) {
// 万能的MyObject
MyObject obj = new MyObject();
obj.name = "name11";
obj.num = 100L;
System.out.println(JSONObject.fromObject(obj));
JsonConfig config = new JsonConfig();
config.registerDefaultValueProcessor(Date.class, new DefaultValueDateProcessor());
config.registerDefaultValueProcessor(Date.class, new DefaultValueDateProcessor2());
config.registerDefaultValueProcessor(MyObjectSon.class, new DefaultValueSonProcessor());
//config.setDefaultValueProcessorMatcher(new DefaultValueDateMatcher());
JSONObject fromObject = JSONObject.fromObject(obj, config);
System.out.println(fromObject.toString());
}
}
注册两个日期默认值得Processor
控制台输出
{"birthday":null,"firstDay":null,"name":"name11","num":100,"son":null}
{"birthday":"2016-11-25","firstDay":"2016-11-25","name":"name11","num":100,"son":"jad"}
1:注册的先后顺序对最后的输出有直接的影响,因此我们可以断定多个相同的类型的Processor,会根据注册的顺序决定执行哪个!
2:目前看来会执行后注册的那个Processor
比如当前这种情况,我希望有两个日期处理的时候无论注册顺序我都希望执行第一个DefaultValueDateProcessor。
这个时候Matcher就发挥它的功效了!
将代码进行修改
/**
*
* @author Administrator
*
*/
public class DefaultValueDateMatcher extends DefaultValueProcessorMatcher {
@SuppressWarnings("rawtypes")
@Override
public Object getMatch(Class arg0, Set arg1) {
System.out.println("class==="+arg0.getName());
//如果是日期类型
if(arg0==Date.class)
{
return MyObject.class;
}
else
{
return arg0;
}
}
public static void main(String[] args) {
// 万能的MyObject
MyObject obj = new MyObject();
obj.name = "name11";
obj.num = 100L;
System.out.println(JSONObject.fromObject(obj));
JsonConfig config = new JsonConfig();
config.registerDefaultValueProcessor(MyObject.class, new DefaultValueDateProcessor());
config.registerDefaultValueProcessor(Date.class, new DefaultValueDateProcessor2());
config.registerDefaultValueProcessor(MyObjectSon.class, new DefaultValueSonProcessor());
config.setDefaultValueProcessorMatcher(new DefaultValueDateMatcher());
JSONObject fromObject = JSONObject.fromObject(obj, config);
System.out.println(fromObject.toString());
}
}
控制台输出
{"birthday":null,"firstDay":null,"name":"name11","num":100,"son":null}
class===java.util.Date
class===java.util.Date
class===cn.test.json.MyObjectSon
{"birthday":"2013-11-12","firstDay":"2013-11-12","name":"name11","num":100,"son":"jad"}
无论怎么变换位置输出都是“2013-11-12”,我们通过Matcher的扩展达到了想要的效果。
这里需要注意:
config.registerDefaultValueProcessor(MyObject.class, new DefaultValueDateProcessor());
这段代码并不是关注Date.class,而是更换为MyObject.class,实际这个时候MyObject.class是一个Key,
所以我们前面重复设置Date.class永远都是最后一个生效,就不难解释了。
这里个人觉得这个设计有些问题,如果支持注册多个Date.class的Processor,根据Matcher的设置进行选择应该更科学!
其他Matcher的思路和原理都是一样的。
个人觉得这个matcher在实际处理中用处不大,就不在对其他的Match进行说明了。