in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java [110:227]
public <T> T readObject(final JsonValue jsonValue, final Type targetType, final boolean applyObjectConverter,
final Collection<Class<?>> skippedConverters) {
final JsonValue.ValueType valueType = jsonValue != null ? jsonValue.getValueType() : null;
if (JsonStructure.class == targetType || JsonObject.class == targetType || JsonValue.class == targetType) {
return (T) jsonValue;
}
if (JsonObject.class.isInstance(jsonValue)) {
return (T) buildObject(
targetType, JsonObject.class.cast(jsonValue), applyObjectConverter,
null, skippedConverters);
}
if (JsonString.class.isInstance(jsonValue)) {
if ((targetType == String.class || targetType == Object.class)) {
return (T) JsonString.class.cast(jsonValue).getString();
}
if (targetType == Character.class || targetType == char.class) {
final CharSequence string = JsonString.class.cast(jsonValue).getChars();
if (string.length() == 1) {
return (T) Character.valueOf(string.charAt(0));
}
throw new IllegalArgumentException("Invalid Character binding"); // don't log the value (pwd case)
}
final Mappings.ClassMapping classMapping = mappings.getClassMapping(targetType);
if (classMapping != null && classMapping.adapter != null) {
return (T) classMapping.adapter.to(JsonString.class.cast(jsonValue).getString());
}
final Adapter adapter = findAdapter(targetType);
if (adapter != null && TypeAwareAdapter.class.isInstance(adapter)) {
final TypeAwareAdapter typeAwareAdapter = TypeAwareAdapter.class.cast(adapter);
if (typeAwareAdapter.getTo() == String.class) {
return (T) adapter.to(JsonString.class.cast(jsonValue).getString());
}
if (typeAwareAdapter.getTo() == JsonString.class) {
return (T) adapter.to(JsonString.class.cast(jsonValue));
}
if (typeAwareAdapter.getTo() == CharSequence.class) {
return (T) adapter.to(JsonString.class.cast(jsonValue).getChars());
}
}
}
if (JsonNumber.class.isInstance(jsonValue)) {
final JsonNumber number = JsonNumber.class.cast(jsonValue);
if (targetType == int.class || targetType == Integer.class) {
return (T) Integer.valueOf(number.intValue());
}
if (targetType == long.class || targetType == Long.class) {
return (T) Long.valueOf(number.longValue());
}
if (targetType == double.class || targetType == Double.class || targetType == Object.class) {
return (T) Double.valueOf(number.doubleValue());
}
if (targetType == float.class || targetType == Float.class) {
return (T) Float.valueOf((float) number.doubleValue());
}
if (targetType == byte.class || targetType == Byte.class) {
final int intValue = number.intValue();
Validator.validateByte(intValue);
return (T) Byte.valueOf((byte) intValue);
}
if (targetType == short.class || targetType == Short.class) {
return (T) Short.valueOf((short) number.intValue());
}
if (targetType == BigDecimal.class || Number.class == targetType) {
return (T) number.bigDecimalValue();
}
if (targetType == BigInteger.class) {
return (T) number.bigIntegerValue();
}
}
if (JsonArray.class.isInstance(jsonValue)) {
JsonArray jsonArray = (JsonArray) jsonValue;
if (Class.class.isInstance(targetType)) {
final Class<?> asClass = (Class) targetType;
if (asClass.isArray()) {
final Class componentType = asClass.getComponentType();
return (T) buildArrayWithComponentType(jsonArray, componentType, config.findAdapter(componentType),
isDedup() ? JsonPointerTracker.ROOT : null, Object.class);
}
if (Collection.class.isAssignableFrom(asClass)) {
return readObject(jsonValue, new JohnzonParameterizedType(asClass, Object.class), applyObjectConverter, skippedConverters);
}
}
if (ParameterizedType.class.isInstance(targetType)) {
final ParameterizedType pt = (ParameterizedType) targetType;
final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(pt, Object.class);
if (mapping == null) {
throw new UnsupportedOperationException("type " + targetType + " not supported");
}
final Type arg = pt.getActualTypeArguments()[0];
return (T) mapCollection(mapping, jsonArray, Class.class.isInstance(arg) ? config.findAdapter(Class.class.cast(arg)) : null,
null, isDedup() ? JsonPointerTracker.ROOT : null, Object.class);
}
if (Object.class == targetType) {
return (T) new ArrayList(asList(Object[].class.cast(buildArrayWithComponentType(jsonArray, Object.class, null,
isDedup() ? JsonPointerTracker.ROOT : null, Object.class))));
}
}
if (NULL == valueType) {
return null;
}
if (TRUE == valueType && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
return (T) Boolean.TRUE;
}
if (FALSE == valueType && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
return (T) Boolean.FALSE;
}
final String snippet = config.getSnippet().of(jsonValue);
final String description = ExceptionMessages.description(valueType);
throw new IllegalArgumentException(targetType + " does not support " + description + ": " + snippet);
}