in johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonJsonb.java [484:535]
public <T> T fromJsonValue(final JsonValue json, final Type type) {
switch (json.getValueType()) {
case NULL:
if (Class.class.isInstance(type) && Class.class.cast(type).isPrimitive()) {
throw new JsonbException("can't map a primritive to null");
}
return null;
case STRING:
if (String.class != type) {
throw new JsonbException("STRING json can't be casted to " + type);
}
return (T) JsonString.class.cast(json).getString();
case TRUE:
case FALSE:
if (Boolean.class != type && boolean.class != type) {
throw new JsonbException("TRUE and FALSE json can't be casted to " + type);
}
return (T) Boolean.valueOf(JsonValue.ValueType.TRUE == json.getValueType());
case NUMBER:
if (!Class.class.isInstance(type) || !Number.class.isAssignableFrom(Class.class.cast(type))) {
throw new JsonbException("NUMBER json can't be casted to " + type);
}
final JsonNumber jsonNumber = JsonNumber.class.cast(json);
if (int.class == type || Integer.class == type) {
return (T) Integer.valueOf(jsonNumber.intValue());
}
if (long.class == type || Long.class == type) {
return (T) Long.valueOf(jsonNumber.longValue());
}
if (double.class == type || Double.class == type) {
return (T) Double.valueOf(jsonNumber.doubleValue());
}
if (float.class == type || Float.class == type) {
return (T) Float.valueOf((float) jsonNumber.doubleValue());
}
if (byte.class == type || Byte.class == type) {
return (T) Byte.valueOf((byte) jsonNumber.intValue());
}
if (short.class == type || Short.class == type) {
return (T) Short.valueOf((short) jsonNumber.intValue());
}
if (BigInteger.class == type) {
return (T) jsonNumber.bigIntegerValue();
}
return (T) jsonNumber.bigDecimalValue();
case OBJECT:
case ARRAY:
return delegate.readObject(JsonStructure.class.cast(json), type);
default:
throw new JsonbException("Unsupported type: " + json.getValueType());
}
}