基于这个问题https://developer.ibm.com/mobilefirstplatform/2015/08/03/integrating-3rd-party-cordova-plug-ins/我实现了以下类:
public class OkJsonConverter<T> {
final Class<T> typeParameterClass;
public OkJsonConverter(Class<T> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}
protected T processJson(String json) throws OkClientException {
T object = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode jsonNode = objectMapper.readTree(json);
if (jsonNode.get("error_code") != null) {
Error error = objectMapper.treeToValue(jsonNode, Error.class);
throw new OkClientException("API returned error", error);
} else {
object = objectMapper.treeToValue(jsonNode, typeParameterClass);
}
} catch (IOException e) {
throw new OkClientException("unable to process json", e);
}
return object;
}
}
我可以将此类与通用参数一起使用,例如:
return new OkJsonConverter<User>(User.class).processJson(response.getBody());
但是现在我正在努力如何使用嵌套的通用参数,例如List<Method>
此代码不起作用:
return new OkJsonConverter<List<Method>>(List<Method>.class).processJson(response.getBody());
请帮助更改此代码以使其正常运行。
答案 0 :(得分:4)
Java没有办法将该类型表示为Class
。你可以得到的最接近的近似值是(Class<List<Method>>) (Class) List.class
,但这只会引发一些论文,而你只是在看一个不知道其元素类型的基本List
。
是否适用于您的JSON转换器并不清楚,但应在您正在使用的转换器的文档中指定,这将自行处理,因为这是一个通用的当你试图反思泛型类型时,Java中的问题。
答案 1 :(得分:0)
最后,感谢user3707125我找到了实现这个目标的方法:
更正public class OkJsonConverter {
private static final String ERROR_CODE_FIELD_NAME = "error_code";
protected <T> T readTreeToValue(String json, TypeReference<T> valueTypeRef) throws OkClientException {
T object = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode jsonNode = objectMapper.readTree(json);
if (jsonNode.has(ERROR_CODE_FIELD_NAME)) {
Error error = objectMapper.treeToValue(jsonNode, Error.class);
throw new OkClientException("Ok API returned error", error);
} else {
JavaType type = objectMapper.getTypeFactory().constructType(valueTypeRef);
object = objectMapper.convertValue(jsonNode, type);
}
} catch (IOException e) {
throw new OkClientException("Unable to process JSON", e);
}
return object;
}
}
现在,以下代码可以正常工作:
List<Method> result = new OkJsonConverter().readTreeToValue(response.getBody(), new TypeReference<List<Method>>() {});