把刚才那些报错的例子,用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) { }