package com.fasterxml.jackson.databind.deser.std;
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.DeserializationContext;
/**
* Base class for simple deserializers that only accept JSON String
* values as the source.
*/
public abstract class FromStringDeserializer<T>
extends StdScalarDeserializer<T>
{
protected FromStringDeserializer(Class<?> vc) {
super(vc);
}
/*
/**********************************************************
/* Deserializer implementations
/**********************************************************
*/
@SuppressWarnings("unchecked")
@Override
public final T deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
// 22-Sep-2012, tatu: For 2.1, use this new method, may force coercion:
String text = jp.getValueAsString();
if (text != null) { // has String representation
if (text.length() == 0 || (text = text.trim()).length() == 0) {
// 15-Oct-2010, tatu: Empty String usually means null, so
return null;
}
try {
T result = _deserialize(text, ctxt);
if (result != null) {
return result;
}
} catch (IllegalArgumentException iae) {
// nothing to do here, yet? We'll fail anyway
}
throw ctxt.weirdStringException(text, _valueClass, "not a valid textual representation");
}
if (jp.getCurrentToken() == JsonToken.VALUE_EMBEDDED_OBJECT) {
// Trivial cases; null to null, instance of type itself returned as is
Object ob = jp.getEmbeddedObject();
if (ob == null) {
return null;
}
if (_valueClass.isAssignableFrom(ob.getClass())) {
return (T) ob;
}
return _deserializeEmbedded(ob, ctxt);
}
throw ctxt.mappingException(_valueClass);
}
protected abstract T _deserialize(String value, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
protected T _deserializeEmbedded(Object ob, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
// default impl: error out
throw ctxt.mappingException("Don't know how to convert embedded Object of type "
+ob.getClass().getName()+" into "+_valueClass.getName());
}
}