Payfort交易JSON转POJO出现类型不匹配错误,求解决方案
问题根源分析
你的JSON根结构是混合类型数组:第一个元素是嵌套的交易对象数组,第二个元素是包含data_count的统计对象;但你的POJO定义成了普通对象,且解析代码错误地试图将JSON转为List<DownloadReportResponse>,完全和JSON结构不匹配,这是类型不匹配的核心原因。
解决方案
步骤1:完善子POJO定义
确保字段名和JSON键对应,添加@JsonProperty注解处理下划线命名:
// 交易统计类 @Data public class TransactionCount { @JsonProperty("data_count") private Integer dataCount; } // 单条交易响应类 @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class TransactionsResponse { @JsonProperty("response_code") private String responseCode; @JsonProperty("card_holder_name") private String cardHolderName; @JsonProperty("acquirer_mid") private String acquirerMid; @JsonProperty("payment_link_id") private String paymentLinkId; @JsonProperty("order_description") private String orderDescription; }
步骤2:两种适配JSON数组结构的解析方式
方式一:手动拆分数组元素(简单直观)
直接将JSON解析为List<Object>,再分别转换为对应类型:
ObjectMapper mapper = new ObjectMapper(); // 解析根数组 List<Object> rootElements = mapper.readValue(report, new TypeReference<List<Object>>() {}); // 转换第一个元素:嵌套交易数组 List<TransactionsResponse> transactions = mapper.convertValue( rootElements.get(0), new TypeReference<List<TransactionsResponse>>() {} ); // 转换第二个元素:统计对象 TransactionCount count = mapper.convertValue(rootElements.get(1), TransactionCount.class); // 组装到你的根POJO DownloadReportResponse result = new DownloadReportResponse(); result.setTransactions(transactions); result.setTransactionCount(count);
方式二:用注解让POJO适配数组结构(更优雅)
修改DownloadReportResponse,用@JsonFormat指定形状为数组,映射属性到数组的对应位置:
@Data @JsonInclude(JsonInclude.Include.NON_NULL) @JsonFormat(shape = JsonFormat.Shape.ARRAY) public class DownloadReportResponse { // 对应数组第一个元素:交易列表 private List<TransactionsResponse> transactions; // 对应数组第二个元素:统计对象 private TransactionCount transactionCount; }
然后直接解析为该对象即可:
DownloadReportResponse result = new ObjectMapper().readValue(report, DownloadReportResponse.class);
关键注意点
- 原解析代码中的
List<DownloadReportResponse>完全错误,JSON根是单个数组,不是多个DownloadReportResponse对象的列表; - 确保所有字段类型和JSON值类型匹配(比如
response_code是字符串,不要定义为Integer)。
内容的提问来源于stack exchange,提问作者yali
相关产品推荐
相关产品推荐

