You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将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 (token JsonToken.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:57:14