Json-lib的处理机制(2)--ProcessorMatcher接口

概述

这是Json-lib处理机制的第二篇。
这一篇文章主要描述了ProcessorMatcher的实际功能。
希望对大家在使用的过程中有帮助。

抽象类对应的Processor
DefaultValueProcessorMatcherDefaultValueProcessor
JsonBeanProcessorMatcherJsonBeanProcessor
JsonValueProcessorMatcherJsonValueProcessor
PropertyNameProcessorMatcherPropertyNameProcessor

我们就对应第一篇相关的内容来实验一下这些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进行说明了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值