in src/main/java/com/aliyun/tea/TeaModel.java [114:159]
private static Object buildObject(Object o, Class self, Type subType, String objectName) {
Class valueClass = o.getClass();
if (Map.class.isAssignableFrom(self) && Map.class.isAssignableFrom(valueClass)) {
Map<String, Object> valueMap = (Map<String, Object>) o;
Map<String, Object> result = new HashMap<String, Object>();
for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
if (null == entry.getValue()) {
result.put(entry.getKey(), null);
} else if (null == subType || subType instanceof WildcardType) {
result.put(entry.getKey(), entry.getValue());
} else if (subType instanceof Class) {
result.put(entry.getKey(), buildObject(entry.getValue(), (Class) subType, null, objectName));
} else {
ParameterizedType parameterizedType = (ParameterizedType) subType;
Type[] types = parameterizedType.getActualTypeArguments();
result.put(entry.getKey(), buildObject(entry.getValue(), (Class) parameterizedType.getRawType(), types[types.length - 1], objectName));
}
}
return result;
} else if (List.class.isAssignableFrom(self) && List.class.isAssignableFrom(valueClass)) {
List<Object> valueList = (List<Object>) o;
List<Object> result = new ArrayList<Object>();
for (Object object : valueList) {
if (null == object) {
result.add(null);
} else if (null == subType || subType instanceof WildcardType) {
result.add(object);
} else if (subType instanceof Class) {
result.add(buildObject(object, (Class) subType, null, objectName));
} else {
ParameterizedType parameterizedType = (ParameterizedType) subType;
Type[] types = parameterizedType.getActualTypeArguments();
result.add(buildObject(object, (Class) parameterizedType.getRawType(), types[types.length - 1], objectName));
}
}
return result;
} else if (TeaModel.class.isAssignableFrom(self) && Map.class.isAssignableFrom(valueClass)) {
try {
return TeaModel.toModel((Map<String, Object>) o, (TeaModel) self.newInstance());
} catch (Exception e) {
throw new TeaException(e.getMessage(), e);
}
} else {
return confirmType(self, o, objectName);
}
}