无法将JSON数组字符串转换为Java List<PaymentObject>问题求助
问题排查:Jackson反序列化JSON字符串为List失败
问题背景
现有一段JSON字符串被存入ApiResponse对象的data字段中,尝试通过Jackson将其转换为PaymentObject列表时触发反序列化错误,相关代码及报错信息如下:
1. 待转换的JSON字符串
String jsonString = "[ { \"nameOnCard\": \"Test T\", \"active\": true, \"declineReason\": null }, { \"nameOnCard\": \"TestT\", \"active\": false, \"declineReason\": \"payment_stolen\" } ]";
2. ApiResponse对象构造
APIResponse apiResponse = APIResponse.builder() .data(jsonString) .build();
3. PaymentObject类定义
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class PaymentObject { private String declineReason; private String nameOnCard; private String active; }
4. 尝试转换的代码
List<PaymentObject> paymentObjectDTOs = mapper.convertValue(apiResponse.getData(), new TypeReference<>() {});
5. 报错信息
Cannot deserialize value of type
java.util.ArrayList<com.abc.PaymentObject>from String value (tokenJsonToken.VALUE_STRING)
at [Source: UNKNOWN; byte offset: #UNKNOWN]
问题原因&解决办法
核心问题
apiResponse.getData()返回的是JSON格式的字符串,而convertValue方法的作用是将Java对象(而非JSON字符串)转换为目标类型,直接传入字符串会让Jackson误判为要将单个字符串转为List,从而触发错误。
另外还有一个隐性问题:PaymentObject的active字段定义为String,但JSON中对应值是布尔类型true/false,直接转换会引发类型不匹配异常,需同步修正。
正确转换方案
方案1:使用readValue解析JSON字符串
针对JSON字符串输入,应使用ObjectMapper的readValue方法替代convertValue:
String jsonData = apiResponse.getData(); List<PaymentObject> paymentObjectDTOs = mapper.readValue(jsonData, new TypeReference<List<PaymentObject>>() {});
方案2:修正PaymentObject字段类型
将active字段类型从String改为Boolean,匹配JSON中的数据类型:
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class PaymentObject { private String declineReason; private String nameOnCard; private Boolean active; // 调整为Boolean类型 }
若必须保留String类型的active,可添加自定义转换逻辑:
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class PaymentObject { private String declineReason; private String nameOnCard; private String active; // 自定义布尔值转字符串的 setter @JsonProperty("active") private void setActive(Boolean active) { this.active = active != null ? active.toString() : null; } }
内容的提问来源于stack exchange,提问作者helloabc123
相关产品推荐
相关产品推荐

