Java ObjectMapper.readValue 将泛型类型转换为 LinkedHashMap

标签 java spring generics objectmapper

    @Service
public class PokemonManager implements PokemonService {

    private HttpResponse<String> getStringHttpResponseByUrl(final String url) {
        HttpClient httpClient = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .GET().header("accept", "application/json")
                .uri(URI.create(url)).build();
        HttpResponse<String> httpResponse = null;
        try {
            httpResponse = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return httpResponse;
    }

    private <T> T getObjectResponse(T t, String url) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            t = objectMapper.readValue(getStringHttpResponseByUrl(url).body(), new TypeReference<>() {
            });
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return t;
    }

    private List<Pokemon> getAllPokemonsAsList() {

        final String POSTS_API_URL = "https://pokeapi.co/api/v2/pokemon?limit=10000";
        PokeApiResponse pokeApiResponse = new PokeApiResponse();
        pokeApiResponse = getObjectResponse(pokeApiResponse, POSTS_API_URL);
        System.out.println(pokeApiResponse);
        return pokeApiResponse.results;
    }

    @Override
    public List<Pokemon> getAll() {
        return getAllPokemonsAsList();
    }

我有上面的代码。如果我不在“getObjectResponse”方法中使用泛型,代码就可以正常工作。但是,当我使用泛型时,“t”的类型变成了“LinkedHashMap”而不是“PokeApiResponse”,代码崩溃了。我该如何解决这个问题?

最佳答案

通常你会使用它:

objectMapper.readValue("yourJSONHere", PokeApiResponse.class);

如果你想要一个通用的 T 响应,也许这会起作用

private <T> T getGeneric(Class<T> clazz, String json) throws IOException {
    return  new ObjectMapper().readValue(json, clazz);
}

例子:

    Pokemon charmander = getGeneric(Pokemon.class, "{\n" +
            "  \"name\": \"charmander\"\n" +
            "}");

关于Java ObjectMapper.readValue 将泛型类型转换为 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69028982/

相关文章:

java - Intellij,如何为 Junit 单元测试设置 JVM 参数?

Java - PriorityQueue 的替代方案,保留重复的插入顺序

java - 'int-jms :message-driven-channel-adapter' with 'selector' creation in Java DSL

java - 如何从 fragment 内调用 asyncTask 到外部服务

java - 使用AOP后注入(inject)的bean变为null

java - 又一个 "Spring ,could not resolve place holder"

java - 继承和泛型以及 Dagger2

java - 使用 GWT 获取父类(super class)中的泛型类型类

java - 方法返回类型来实现多个接口(interface) - 再次

java - PriorityQueue,优先插入