jQuery Ajax返回JSON字符串而非对象数组,预发环境JSON.parse报错求助
排查ASP.NET MVC Ajax返回JSON字符串而非对象数组的预发环境问题
首先,咱们先定位核心问题:你本地能用JSON.parse()正常转换,但预发环境报错,本质是jQuery在预发环境已经自动把响应解析成了对象,你再调用JSON.parse()就会把对象转成"[object Object]"这类无效JSON字符串,自然报错。下面一步步拆解原因和解决方案:
1. 移除多余的JSON.parse()调用
你的Ajax配置里已经设置了dataType: 'json',这会告诉jQuery自动把服务器返回的响应解析为JavaScript对象。本地环境可能因为响应头配置问题(比如Content-Type不是application/json),jQuery没触发自动解析,所以手动parse能凑效;但预发环境的响应头是正确的,这时候jsonData已经是你要的[object,object,...]数组了,再parse纯属画蛇添足。
修改后的Ajax代码:
$("#btnVendorSearch").click(function() { if (RequiredFieldValidate() != false) { var SupplierNumber = $('#txtVendorNumber').val(); $.ajax({ type: "POST", url: getExactPath('/Supplier/GetSupDocuments'), async: false, data: { SupplierNo: SupplierNumber }, dataType: 'json', success: function(jsonData) { // 直接使用已解析好的对象数组 if (!jsonData.error || jsonData.error === undefined) { FillGrid(jsonData); } else { console.log(jsonData.error); } }, error: function() { alert("Unable to fetch the data"); } }); } });
2. 确保Controller返回正确的JSON格式
虽然你的Controller代码看起来没问题,但为了避免预发环境的配置差异,建议明确指定JsonRequestBehavior,同时确保返回的是纯JSON而非序列化后的字符串:
修改后的Controller方法:
public JsonResult GetSupDocuments(string SupplierNo) { string Error = ""; DocumentumUtil dUtil = new DocumentumUtil(); List<Attachment> AttachmentDetails = new List<Attachment>(); try { AttachmentDetails = dUtil.GetSupplierAttachments(SupplierNo); // 明确允许GET/POST请求获取JSON(避免环境配置限制) return Json(AttachmentDetails, JsonRequestBehavior.AllowGet); } catch (System.Exception ex) { Error = ex.Message; } return Json(new {error = Error}, JsonRequestBehavior.AllowGet); }
3. 验证预发环境的响应头
在预发环境打开浏览器开发者工具(F12),切换到Network标签,触发Ajax请求后查看响应的Content-Type:
- 正常应该是
application/json; charset=utf-8,这是jQuery自动解析的前提; - 如果是
text/plain或其他类型,说明预发环境的IIS或全局配置有问题,需要调整服务器端的响应头设置。
4. 排查全局序列化配置
检查项目的Global.asax或Startup.cs里有没有自定义的JSON序列化配置,比如错误地将对象序列化为字符串类型的JSON(比如双重序列化),这也会导致返回的是JSON字符串而非对象数组。
内容的提问来源于stack exchange,提问作者AdithyaM
相关产品推荐
相关产品推荐

