in src/main/java/software/amazon/cloudformation/proxy/aws/SdkPojoDeserializer.java [107:171]
private Object readObject(SdkField<?> field, JsonParser p, DeserializationContext ctxt) throws IOException {
MarshallingType<?> type = field.marshallingType();
switch (p.currentToken()) {
case VALUE_FALSE:
case VALUE_TRUE: {
if (type.equals(MarshallingType.BOOLEAN)) {
return p.getBooleanValue();
}
throw new JsonMappingException(p, "Type mismatch, expecting " + type + " got boolean field value");
}
case VALUE_NUMBER_FLOAT:
case VALUE_NUMBER_INT: {
if (type.equals(MarshallingType.INTEGER)) {
return p.getIntValue();
} else if (type.equals(MarshallingType.LONG)) {
return p.getLongValue();
} else if (type.equals(MarshallingType.FLOAT)) {
return p.getFloatValue(); // coerce should work
} else if (type.equals(MarshallingType.DOUBLE)) {
return p.getDoubleValue(); // coerce should work
} else if (type.equals(MarshallingType.BIG_DECIMAL)) {
return p.getDecimalValue(); // coerce should work
} else if (type.equals(MarshallingType.INSTANT)) { // we serialize as BigDecimals
JsonDeserializer<Object> deser = ctxt.findRootValueDeserializer(ctxt.constructType(Instant.class));
return deser.deserialize(p, ctxt);
}
throw new JsonMappingException(p,
"Type mismatch, expecting " + type + " got int/float/double/big_decimal/instant");
}
case VALUE_STRING: {
if (type.equals(MarshallingType.STRING)) {
return p.getText();
} else if (type.equals(MarshallingType.SDK_BYTES)) {
byte[] bytes = p.getBinaryValue();
return SdkBytes.fromByteArray(bytes);
}
throw new JsonMappingException(p, "Type mismatch, expecting " + type + " got string/bytes");
}
case START_OBJECT: {
if (type.equals(MarshallingType.MAP)) {
return readMap(field, p, ctxt);
} else if (type.equals(MarshallingType.SDK_POJO)) {
return readPojo(field.constructor().get(), p, ctxt);
}
throw new JsonMappingException(p, "Type mismatch, expecting " + type + " got Map/SdkPojo");
}
case START_ARRAY: {
if (type.equals(MarshallingType.LIST)) {
return readList(field, p, ctxt);
}
throw new JsonMappingException(p, "Type mismatch, expecting " + type + " got List type");
}
case VALUE_NULL:
return null;
default:
throw new JsonMappingException(p, "Can not map type " + type + " Token = " + p.currentToken());
}
}