JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token;

本文探讨了在前后端联调中遇到的JSON解析错误,焦点在于字符串与数组类型的参数不匹配。解决办法在于前端调整参数格式,确保与后端接口的预期一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前后端接口联调的时候查看日志报错:JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token;

主要是前后端传参类型不一致导致的,前端的某个字段传的是数组,但是后端的是string,所以就导致报错;

解决方法:让前端修改入参的格式;

### 解决方案 当遇到 `JSON parse error: Cannot deserialize instance of java.lang.String out of START_OBJECT token` 错误时,通常是因为服务器期望接收到简单的字符串值,而客户端却传递了一个复杂的 JSON 对象。为了修复这个问题,可以采取以下几种方式: #### 方法一:调整参数绑定类型 如果API设计允许修改,则考虑改变控制器中的方法签名来匹配实际传输的数据结构。例如,假设当前的方法定义如下所示[^1]: ```java @PostMapping("/example") public ResponseEntity<String> example(@RequestParam String data){ ... } ``` 此时应该改为接受整个请求体作为输入,并将其映射到合适的类上: ```java @PostMapping("/example") public ResponseEntity<Void> example(@RequestBody MyDataClass data){ // 处理data... } class MyDataClass { private String content; public void setContent(String c){this.content=c;} public String getContent(){return this.content;} } ``` 这样做的好处是可以更灵活地处理复杂的数据格式。 #### 方法二:简化客户端提交的内容 如果不希望更改服务端逻辑,在Postman或其他工具中发送请求时应当只提供纯文本形式的字符串而不是嵌套的对象。比如原本可能尝试发送这样的JSON对象: ```json { "content": {"key":"value"} } ``` 这时应直接设置为简单字符串: ```json "value" ``` 注意这里的双引号表示这是一个字符串字面量而非键值对的一部分[^4]。 #### 方法三:自定义反序列化器 对于某些特殊情况下的需求,还可以通过实现Jackson库提供的`JsonDeserializer<T>`接口来自定义特定类型的转换行为。不过这种方法相对较为复杂,一般情况下不推荐优先采用此途径解决问题。 ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; public class CustomStringDeserializer extends StdDeserializer<String> { protected CustomStringDeserializer() { super(String.class); } @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonNode node = p.getCodec().readTree(p); if (node.isObject()) { StringBuilder sb = new StringBuilder(); Iterator<Map.Entry<String, JsonNode>> fieldsIterator = node.fields(); while(fieldsIterator.hasNext()){ Map.Entry<String, JsonNode> field = fieldsIterator.next(); sb.append(field.getKey()).append(": ").append(field.getValue().asText()); if(fieldsIterator.hasNext()) sb.append(", "); } return sb.toString(); } else { return node.asText(); } } } ``` 之后可以在实体属性上面标注使用该定制化的解析器: ```java @JsonDeserialize(using=CustomStringDeserializer.class) private String myField; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值