JSON parse error: Cannot deserialize instance of `java.util.ArrayList<com.nari.dbjg.api.dto.SaveSenDataDto>` out of VALUE_STRING token;
时间: 2025-07-10 22:10:39 浏览: 16
在 Java 中处理 JSON 反序列化时,如果遇到错误提示如 `Cannot deserialize value of type java.util.ArrayList<com.nari.dbjg.api.dto.SaveSenDataDto> from Object value (token JsonToken.START_OBJECT)` 或者 `Cannot deserialize instance of java.util.ArrayList<...> out of VALUE_STRING`,通常是因为传入的 JSON 数据格式与期望的类型不匹配。以下是解决此类问题的方法:
### 1. 确保输入数据为数组格式
当反序列化目标是一个 `ArrayList` 时,JSON 输入必须是一个数组结构,例如:
```json
[
{
"id": 1,
"name": "张三"
},
{
"id": 2,
"name": "李四"
}
]
```
如果提供的是字符串形式的值(如 `"data":"[{'id':1}]"`),则会导致反序列化失败[^2]。
### 2. 检查 JSON 字符串是否正确转义
在某些情况下,尤其是在通过 HTTP 请求体传输数据时,确保 JSON 字符串没有被额外引号包裹或未正确转义。例如,以下格式是无效的:
```json
"{\"data\": \"[{\"id\": 1}]}"
```
应修正为:
```json
{"data": [{"id": 1}]}
```
### 3. 使用 Jackson 自定义反序列化器(可选)
如果数据源无法更改格式,可以通过自定义反序列化逻辑来处理非标准输入。例如,编写一个继承自 `JsonDeserializer<ArrayList<SaveSenDataDto>>` 的类,并实现解析逻辑以适应特殊格式[^3]。
### 4. 调试工具推荐
使用 Postman 或 curl 测试接口时,请确认请求头中 `Content-Type` 设置为 `application/json`,并直接发送原始 JSON 数组内容而非字符串形式。
### 示例代码:验证 JSON 是否能成功反序列化为 ArrayList
```java
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
public class JsonDeserializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String jsonInput = "[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]";
try {
ArrayList<SaveSenDataDto> list = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(ArrayList.class, SaveSenDataDto.class));
System.out.println("成功反序列化");
} catch (Exception e) {
System.err.println("反序列化失败: " + e.getMessage());
}
}
}
class SaveSenDataDto {
private int id;
private String name;
// Getters and Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
```
阅读全文
相关推荐


















