jQuery AJAX传含DevExpress多选值的多参数时JSON序列化报循环结构错误
报错根源定位
这个Uncaught TypeError: Converting circular structure to JSON错误和“普通文本+数组”的混合参数类型完全无关,本质是DevExpress控件客户端返回的选中项对象自带循环引用属性,无法被原生JSON.stringify序列化。
补充说明:ASPxListBox.GetSelectedItems()返回的不是纯值集合,是DevExpress封装的客户端Item对象,内部持有指向父控件实例、事件回调绑定的引用链,存在循环嵌套关系。哪怕返回的数组长度和实际选中项数量完全匹配,序列化过程遍历到这些内部引用时就会直接抛出异常。你之前尝试直接传递选中项返回值、手动封装对象数组的操作之所以失败,核心原因是过程中嵌入了带引用链的DevExpress封装对象,而非参数类型的问题。
正确实现步骤
- 第一步:提取纯值,不要直接传递控件返回的选中项对象
不要将GetSelectedItems()的返回值直接作为参数,需要从每个选中项中提取纯文本/数字值,组成无引用的原生数组。可直接使用DevExpress内置的GetSelectedValues()方法一步拿到纯值集合,也可以手动遍历提取:// 方式1:用控件内置方法直接获取纯值数组 const selectedLocationCodes = checkListBox.GetSelectedValues(); // 方式2:手动遍历选中项提取值(兼容低版本控件) const selectedLocationCodes = checkListBox.GetSelectedItems().map(item => item.value); - 第二步:构造无引用的请求参数对象
将普通文本参数和提取完成的纯数组一起放入参数对象,全程不要混入控件实例、控件原生Item对象:const requestParams = { // 普通文本参数正常定义即可 updateAction: "bulk_update", operatorId: "user_123", // 传入提取完成的纯数组,而非控件原始返回值 LocationCode: selectedLocationCodes, remark: "批量更新PlantCode映射关系" }; - 第三步:发起jQuery AJAX请求
实际上jQuery会自动对传入data字段的对象做序列化处理,不需要手动调用JSON.stringify,只要保证传入的是上面构造的纯参数对象即可:$.ajax({ url: "/api/plant/update", type: "POST", data: requestParams, success: (response) => { console.log("请求成功", response); }, error: (err) => { console.error("请求失败", err); } });
常见踩坑说明
- 不要在参数对象中混入DevExpress控件的客户端实例(比如
checkListBox本身),这类对象内部包含大量循环引用属性,触发序列化报错是必然结果。 - 手动封装对象数组时,不要直接把Item对象作为数组元素,只需要提取Item对应的
value、text这类基础字段即可。 - 如果需要传递JSON格式的请求体,可在AJAX配置中加上
contentType: "application/json",并对构造好的纯参数对象调用JSON.stringify,因为此时参数内已经没有循环引用,不会再触发报错。
内容的提问来源于stack exchange,提问作者ak74
相关产品推荐
相关产品推荐

