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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:58:32