org.codehaus.jackson.map.deser.StdKeyDeserializers Maven / Gradle / Ivy
Go to download
Data Mapper package is a high-performance data binding package
built on Jackson JSON processor
package org.codehaus.jackson.map.deser;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.*;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.KeyDeserializer;
import org.codehaus.jackson.map.type.*;
import org.codehaus.jackson.map.introspect.BasicBeanDescription;
import org.codehaus.jackson.type.JavaType;
/**
* Helper class used to contain simple/well-known key deserializers.
* Following kinds of Objects can be handled currently:
*
* - Primitive wrappers
* - Enums (usually not needed, since EnumMap doesn't call us)
* - Anything with constructor that takes a single String arg
* (if not explicitly @JsonIgnore'd)
* - Anything with 'static T valueOf(String)' factory method
* (if not explicitly @JsonIgnore'd)
*
*/
class StdKeyDeserializers
{
final HashMap _keyDeserializers = new HashMap();
private StdKeyDeserializers()
{
add(new StdKeyDeserializer.BoolKD());
add(new StdKeyDeserializer.ByteKD());
add(new StdKeyDeserializer.CharKD());
add(new StdKeyDeserializer.ShortKD());
add(new StdKeyDeserializer.IntKD());
add(new StdKeyDeserializer.LongKD());
add(new StdKeyDeserializer.FloatKD());
add(new StdKeyDeserializer.DoubleKD());
}
private void add(StdKeyDeserializer kdeser)
{
Class> keyClass = kdeser.getKeyClass();
_keyDeserializers.put(TypeFactory.type(keyClass), kdeser);
}
public static HashMap constructAll()
{
return new StdKeyDeserializers()._keyDeserializers;
}
/*
////////////////////////////////////////////////////////////
// Dynamic factory methods
////////////////////////////////////////////////////////////
*/
public static KeyDeserializer constructEnumKeyDeserializer(DeserializationConfig config, JavaType type)
{
EnumResolver> er = EnumResolver.constructUnsafe(type.getRawClass(), config.getAnnotationIntrospector());
return new StdKeyDeserializer.EnumKD(er);
}
public static KeyDeserializer findStringBasedKeyDeserializer(DeserializationConfig config, JavaType type)
{
/* We don't need full deserialization information, just need to
* know creators.
*/
BasicBeanDescription beanDesc = config.introspect(type);
// Ok, so: can we find T(String) constructor?
Constructor> ctor = beanDesc.findSingleArgConstructor(String.class);
if (ctor != null) {
return new StdKeyDeserializer.StringCtorKeyDeserializer(ctor);
}
/* or if not, "static T valueOf(String)" (or equivalent marked
* with @JsonCreator annotation?)
*/
Method m = beanDesc.findFactoryMethod(String.class);
if (m != null){
return new StdKeyDeserializer.StringFactoryKeyDeserializer(m);
}
// nope, no such luck...
return null;
}
}