关于fastjson和jackson将json字符串解析成实体的过程(二)

把刚才那些报错的例子,用jackson处理,会发现全部成功,不会报错,测试例子:

那现在看看jackson怎么处理的,进入readValue方法:

进入_jsonFactory.createJsonParser(content):

其实就是根据json字符串转换成一个流,并生成一个jsonParser:

而TypeFactory.type(valueType)方法会生成一个jackson的simple type,例子里是person.class,具体截图:

然后进入_readMapAndClose方法:

具体看

DeserializationConfig cfg = copyDeserializationConfig();
DeserializationContext ctxt = _createDeserializationContext(jp, cfg);
result = _findRootDeserializer(cfg, valueType).deserialize(jp, ctxt);

这三行代码。1是拷贝了反序列化的配置,2是根据配置和上面的ReaderBasedParser,生成一个反序列化的上下文对象,3是先根据配置和所传的对象类型找到对应的反序列化器,感觉这里的逻辑和fastjson很像:

然后具体解析就是deserialize方法了:

public final Object deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException
    {
        JsonToken t = jp.getCurrentToken();
        if(t == JsonToken.START_OBJECT)
        {
            jp.nextToken();
            return deserializeFromObject(jp, ctxt);
        }
        static class _cls1
        {

            static final int $SwitchMap$org$codehaus$jackson$JsonToken[];
            static final int $SwitchMap$org$codehaus$jackson$JsonParser$NumberType[];

            static 
            {
                $SwitchMap$org$codehaus$jackson$JsonParser$NumberType = new int[org.codehaus.jackson.JsonParser.NumberType.values().length];
                try
                {
                    $SwitchMap$org$codehaus$jackson$JsonParser$NumberType[org.codehaus.jackson.JsonParser.NumberType.INT.ordinal()] = 1;
                }
                catch(NoSuchFieldError ex) { }
                try
                {
                    $SwitchMap$org$codehaus$jackson$JsonParser$NumberType[org.codehaus.jackson.JsonParser.NumberType.LONG.ordinal()] = 2;
                }
                catch(NoSuchFieldError ex) { }
         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值