in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java [1138:1191]
private Object convertTo(final Type aClass, final String text) {
if (Object.class == aClass || String.class == aClass) {
return text;
}
final Adapter converter = findAdapter(aClass);
Method method = valueOfs.get(aClass);
if (method == null && Class.class.isInstance(aClass)) { // handle primitives
final Class cast = Class.class.cast(aClass);
try {
method = cast.getMethod("valueOf", String.class);
if (Modifier.isPublic(method.getModifiers()) && Modifier.isStatic(method.getModifiers())) {
valueOfs.putIfAbsent(cast, method);
} else {
method = null;
}
} catch (final NoSuchMethodException e) {
// if a real primitive (very unlikely) try the wrapper
if (char.class == aClass) {
return CHARACTER_CONVERTER.fromString(text);
}
try {
return convertTo(Class.class.cast(cast.getField("TYPE").get(null)), text);
} catch (final Exception e1) {
// no-op
}
// no-op
}
}
if (method != null) {
try {
return method.invoke(null, text);
} catch (final IllegalAccessException e) {
throw new IllegalStateException(e);
} catch (final InvocationTargetException e) {
throw new MapperException(e.getCause());
}
}
if (converter == null) {
if (ParameterizedType.class.isInstance(aClass)) {
ParameterizedType parameterizedType = (ParameterizedType) aClass;
final Type rawType = parameterizedType.getRawType();
final Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
if (Optional.class == rawType && actualTypeArguments.length == 1) {
// convert the type parameter
final Type actualType = actualTypeArguments[0];
return Optional.of(convertTo(actualType, text));
}
return convertTo(rawType, text);
}
throw new MapperException("Missing a Converter for type " + aClass + " to convert the JSON String '" +
text + "' . Please register a custom converter for it.");
}
return converter.to(text);
}