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

如何将JavaScript数组转为Java类的ArrayList?解决JSON反序列化报错

解决JSON反序列化错误:Angular数组映射到Java ArrayList

你遇到的JSON parse error: Cannot deserialize instance of java.lang.String out of START_ARRAY token,本质是后端期望接收String类型的字段,却收到了JSON数组。结合你的代码来看,问题集中在images字段的反序列化环节,下面是具体的排查和解决方法:

1. 先确认前端发送的images数据格式

先打开浏览器开发者工具(F12),切换到Network标签找到你的POST请求,查看Payload里的images字段是否是纯字符串数组,比如:

"images": ["https://example.com/img1.jpg", "https://example.com/img2.jpg"]

如果你的$scope.images里存的是File对象(比如用户上传的本地图片)或者其他复杂对象,后端根本没法把它转成String类型的集合——这时候你需要先把图片转成可序列化的字符串(比如转成Base64编码,或者先上传到服务器拿到URL字符串)再发送请求。

2. 给后端Advertisement类补全必要配置

Java的Advertisement类需要明确告诉Jackson如何处理images这个集合字段,同时一定要补全getter/setter方法(Jackson默认通过这些方法访问字段,没有的话会直接失败):

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.util.ArrayList;

public class Advertisement {
    // 其他字段保持不变...
    @JsonProperty("images") // 明确绑定JSON里的字段名,避免大小写/命名风格不匹配
    @JsonDeserialize(as = ArrayList.class) // 指定反序列化的集合实现类
    private ArrayList<String> images;

    // 必须添加的getter和setter
    public ArrayList<String> getImages() {
        return images;
    }

    public void setImages(ArrayList<String> images) {
        this.images = images;
    }
}

3. 优化Spring控制器的配置

确保你的控制器类使用@RestController注解(它会自动配置JSON消息转换器,比普通的@Controller更适合接口场景):

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestBody;

@RestController
public class AdvertisementController {
    @RequestMapping(value = "/post", method = RequestMethod.POST)
    public boolean postAds(@RequestBody Advertisement newAd) {
        // 优化日志打印,避免拼接混乱
        System.out.printf(
            "收到广告:名称=%s,房间数=%d,图片数量=%d%n",
            newAd.name, newAd.rooms, newAd.images.size()
        );
        return true;
    }
}

4. 额外排查小细节

  • 检查前端代码的拼写:比如后端字段是images,你有没有写成image或者其他错误拼写?
  • 如果最近修改过Advertisement类,记得清理项目的编译缓存,避免旧的class文件导致的奇怪问题。

按照上面的步骤调整后,应该就能顺利把前端的$scope.images数组反序列化成后端的ArrayList<String>了。

内容的提问来源于stack exchange,提问作者Gabi Onea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:08:47