对于json映射,我使用以下方法:
ngModel
UserDto 看起来像这样:
public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() {
});
}
我希望改进这种映射方法,而不是附加到 UserDto 类,并将其替换为泛型。
有可能吗?怎么样?
感谢。
答案 0 :(得分:2)
TypeReference
要求您静态指定参数,而不是动态指定参数,因此如果您需要进一步参数化类型,它将无效。
我认为您需要的是JavaType
:您可以使用TypeFactory
动态构建实例。您通过TypeFactory
获得ObjectMapper.getTypeFactory()
的实例。您还可以从简单JavaType
以及Class
构建TypeReference
个实例。
答案 1 :(得分:0)
一种方法是定义一个表示 clazz 类型项目列表的Jackson JavaType 。您仍然需要在运行时访问通用参数的类。常用的方法是
<T> class XX { XX(Class<T> clazz, ...) ... }
将通用参数的类传递给构造时的通用类。
在访问Class clazz 变量后,您可以使用以下语句构造一个Jackson JavaType,以表示例如 clazz 类的项目列表。
JavaType itemType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);
我希望能有所帮助。我在自己的代码中使用了这种方法。
答案 2 :(得分:0)
试试这个:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.reflect.Array;
import java.util.Arrays;
...
public static <TargetType> List<TargetType> convertToList(String jsonString, Class<TargetType> targetTypeClass) {
List<TargetType> listOfTargetObjects = null;
ObjectMapper objectMapper = new ObjectMapper();
TargetType[] arrayOfTargetType = (TargetType[]) Array.newInstance(targetTypeClass, 0);
try {
listOfTargetObjects = (List<TargetType>) Arrays.asList(objectMapper.readValue(jsonString, arrayOfTargetType.getClass()));
} catch (JsonMappingException jsonMappingException) {
listOfTargetObjects = null;
} catch (JsonProcessingException jsonProcessingException) {
listOfTargetObjects = null;
} catch (Exception exception) {
listOfTargetObjects = null;
}
return listOfTargetObjects;
}
...