有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中为Jackson/ObjectMapper创建通用函数?

所以我有这些方法:

private List<ClientRepresentation> toClientRepresentation(String json) {
    try {
        return objectMapper.readValue(json, new TypeReference<List<ClientRepresentation>>() {
        });
    } catch (JsonProcessingException e) {
        throw new RuntimeException("Could not parse json.");
    }
}

private List<RoleRepresentation> toRoleRepresentation(String json) {
    try {
        return objectMapper.readValue(json, new TypeReference<List<RoleRepresentation>>() {
        });
    } catch (JsonProcessingException e) {
        throw new RuntimeException("Could not parse json.");
    }
}

private List<UserRepresentation> toUserRepresentation(String json) {
    try {
        return objectMapper.readValue(userJson, new TypeReference<List<UserRepresentation>>() {
        });
    } catch (JsonProcessingException e) {
        throw new RuntimeException("Could not parse json.");
    }
}

你可以看到这些是相似的。。。想有一个方法来解决这些。。。大概是这样的:

private List<T> toObjectsList(String json, Class classToConvert) {
    try {
        return objectMapper.readValue(json, new TypeReference<List<classToConvert>>() {
        });
    } catch (JsonProcessingException e) {
        throw new RuntimeException("Could not parse json.");
    }
}

可能吗?怎么做

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    首先请注意Class<?>只能用于传递无类型参数的构造。因此,像List<String>这样的东西不能用它来传达(只有“列表”-任何和所有列表,未经参数化-这是类唯一可以传达的东西)。如果你想要toObjectsList返回类似于List<Map<String, Object>>的东西,你在这个问题上就死定了:整个设置根本无法做到这一点。所以,首先考虑一下这是不是一个好主意:你在妨碍你自己,你的^ {< CD3}}方法永远无法返回类型化类型的列表。大概,如果您愿意记录这一点,并通过不使用toObjectsList和编写基于readValue的自定义方法来满足这些需求,那么您就可以开始了

    假设您已经接受了这个限制,那么问题可以归结为:如何动态地构造STT(超级类型标记,后面有括号的TypeReference对象)

    这应该是可行的,使用^{}

    例如,constructParametricType(List.class, List.class, classToConvert);

    然后,我们需要解决代码中的一些其他错误:

    • 这种异常处理是可悲的。你把所有有用的信息都扔掉了,取而代之的是完全无用的信息。不要编写无法解决问题的catch块,除非该catch块保留了所有信息。此外,按照惯例,异常消息不会以标点符号结尾
    • 在这些方法中使用的是<T>,但首先需要声明T存在
    • Class本身是参数化的

    这使我们能够:

    private <T> List<T> toObjectsList(String json, Class<T> classToConvert) {
        JavaType typeTarget = TypeFactory.defaultInstance()
            .constructParametricType(List.class, List.class, classToConvert);
    
        try {
            return objectMapper.readValue(json, typeTarget);
        } catch (JsonProcessingException e) {
            // pass the original exception along as cause, preserving info.
            throw new RuntimeException("Could not parse json", e);
        }
    }
    

    (你可能必须投到List<T>,但我认为由于杰克逊的某些可疑黑客行为,不需要投到List<T>