MVC中jQuery AJAX获取数据后JSON.parse报语法错误求助
问题:JSON解析时抛出"Uncaught SyntaxError: Unexpected end of JSON input"错误
控制台错误信息:
Uncaught SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) at GetExistingSubList (310:2611:34) at HTMLDocument.<anonymous> (310:2392:17) at fire (jquery-1.12.4.js:3232:31) at Object.fireWith [as resolveWith] (jquery-1.12.4.js:3362:7) at Function.ready (jquery-1.12.4.js:3582:13) at HTMLDocument.completed (jquery-1.12.4.js:3617:10)
相关代码如下:
控制器代码
[HttpPost] public ActionResult Getsubscriptiondata() { var subdata = db.ExistingSubscriptionList.Where(substatus => substatus.OSCP_SubStatusId == "1").ToList(); return Content(JsonConvert.SerializeObject(subdata)); }
AJAX调用代码
function getExistingSubValue() { $.ajax({ type: "POST", url: "/UserManagement/Getsubscriptiondata", contentType: false, data: {}, cache: false, success: function (data) { $("#hdnExistingSubs").val(data); } }); }
数据解析代码
if (ServiceId != '' && CloudId == '1' && IdentityTenantId != '') { var flag = 0; var data = $('#hdnExistingSubs').val(); var items = JSON.parse(data); var table = $('#tblExistingSubs').DataTable(); table.rows().remove().draw(); var result = []; for (var item, i = 0; item = items[i++];) { result.push(item); } }
解决方法
1. 修正控制器返回类型与响应头
原代码用Content()返回序列化后的JSON,但未指定正确的Content-Type,导致jQuery无法自动识别响应格式,同时可能存在JSON转义问题。修改控制器代码为两种方式之一:
方式一:使用MVC内置的JsonResult
[HttpPost] public ActionResult Getsubscriptiondata() { var subdata = db.ExistingSubscriptionList.Where(substatus => substatus.OSCP_SubStatusId == "1").ToList(); return Json(subdata, JsonRequestBehavior.AllowGet); }
方式二:指定Content-Type为application/json
[HttpPost] public ActionResult Getsubscriptiondata() { var subdata = db.ExistingSubscriptionList.Where(substatus => substatus.OSCP_SubStatusId == "1").ToList(); return Content(JsonConvert.SerializeObject(subdata), "application/json"); }
2. 修正AJAX请求配置
原代码中contentType: false是错误的,该配置仅用于上传FormData场景。同时添加dataType: "json"让jQuery自动解析响应为JSON对象,无需手动调用JSON.parse:
function getExistingSubValue() { $.ajax({ type: "POST", url: "/UserManagement/Getsubscriptiondata", contentType: "application/json", data: JSON.stringify({}), dataType: "json", cache: false, success: function (data) { processExistingSubs(data); } }); }
3. 避免通过隐藏域传递JSON
隐藏域存储JSON时,可能因HTML转义(如双引号被转义为")导致解析失败。直接在AJAX成功回调中处理数据:
function processExistingSubs(items) { if (ServiceId != '' && CloudId == '1' && IdentityTenantId != '') { var flag = 0; var table = $('#tblExistingSubs').DataTable(); table.rows().remove().draw(); var result = []; for (var i = 0; i < items.length; i++) { result.push(items[i]); } // 后续表格渲染等逻辑... } }
内容的提问来源于stack exchange,提问作者Sadiq
相关产品推荐
相关产品推荐

