如何获取具有泛型类的实际类型对象?

问题描述 投票:0回答:1

我收到错误

Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.test.QueryOrderInfo

bizContent是一个json字符串,我想将其解析为

QueryOrderInfo
对象。

更新: 现在我添加了

fromJson2()
方法,效果很好。但为什么它在
fromJson()
方法中抛出异常

    public static void main(String[] args) {
        BaseResponse<QueryOrderInfo> queryOrderInfoBaseResponse = null;
        try {
            queryOrderInfoBaseResponse = new ObjectMapper().readValue("{\"returnCode\":\"SUCCESS\",\"biz_content\":\"{\\\"mchReserved\\\":\\\"1\\\",\\\"cmbOrderId\\\":\\\"900119022715203210134445\\\",\\\"dscAmt\\\":\\\"0\\\",\\\"payType\\\":\\\"ZF\\\",\\\"orderId\\\":\\\"9001004180329103417277\\\",\\\"txnTime\\\":\\\"20190227152032\\\",\\\"merId\\\":\\\"3089991701207X7\\\",\\\"currencyCode\\\":\\\"156\\\",\\\"txnAmt\\\":\\\"1\\\",\\\"tradeState\\\":\\\"S\\\"}\",\"sign\":\"kGE7mwX/ubRlPsPZGNydjY3uCjILgGuxD4j1e/inyC/DlHn5o7LkISpmrH0YQvoZT6lyOxtr9uIkKnqVcTMZNYeYIBU+Tz8NRaPZHuFr/qQb0+fUgEgq5j9ovaFczAF8wrnEfIRYBEqp0ERtK7NG+X6eZLIr9nNVy31eKcnFx1tToJ/zPYN91GOKOtTrJaJrKeDY4+r3ctzsDhnD+TO2MX5zfvW0WLoUjvX5geiYLVpt022BiyxSJyOsrDS858RBmZ5FbVlYP0v/WqwX+J8VY1kDSLxvPtSZuPnsluJPXw6ccnYNH8dir0VgrYfrWRvnupctIm2elCmL7ES6KzDTGg==\",\"encoding\":\"UTF-8\",\"version\":\"0.0.1\",\"signMethod\":\"01\",\"respCode\":\"SUCCESS\"}", new TypeReference<BaseResponse<QueryOrderInfo>>() {
            });
            QueryOrderInfo queryOrderInfo = queryOrderInfoBaseResponse.fromJson();
QueryOrderInfo queryOrderInfo2 = queryOrderInfoBaseResponse.fromJson2(QueryOrderInfo.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

BaseResponse 类

@NoArgsConstructor
@Data
public class BaseResponse<T> {

    private String returnCode;
    @JsonProperty(value = "biz_content")
    private String bizContent;
    private String sign;
    private String encoding;
    private String version;
    private String signMethod;
    private String respCode;

    private String errCode;
    private String respMsg;

    public T fromJson() {
        try {
            return new ObjectMapper().readValue(this.bizContent, new TypeReference<T>() {
            });
        } catch (JsonProcessingException e) {
            return null;
        }
    }

public T fromJson2(Class<T> clazz) {
        try {
            return new ObjectMapper().readValue(this.bizContent, clazz);
        } catch (JsonProcessingException e) {
            return null;
        }
    }
}

@NoArgsConstructor
@Data
public class QueryOrderInfo {

    private String mchReserved;
    private String cmbOrderId;
    private String dscAmt;
    private String payType;
    private String orderId;
    private String txnTime;
    private String merId;
    private String currencyCode;
    private String txnAmt;
    private String tradeState;
}
java spring spring-boot
1个回答
0
投票

我们不应该将

TypeReference
与类型变量一起使用,因为由于 Java 类型擦除,它不起作用。 所以new
TypeReference<T>() { }
,这个说法大致相当于new
TypeReference<Object>() { }
这就是为什么如果你有 JSON 对象,它会映射为 LinkedHashMap。

我在调试此问题时发现了这种类型转换。希望这能帮助您理解 为什么 fromJson() 抛出异常。

enter image description here

您可以在这里阅读更多内容

© www.soinside.com 2019 - 2024. All rights reserved.