JSON原语在Ajax jQuery调用中无效
我陷入了这个我无法解决的问题。我尝试了许多解决方案,我也搜索了StackOverflow,发现了许多旨在解决这个问题的问题,但没有一个对我有效。 这是我的问题: 我有这个功能JSON原语在Ajax jQuery调用中无效,jquery,json,ajax,Jquery,Json,Ajax,我陷入了这个我无法解决的问题。我尝试了许多解决方案,我也搜索了StackOverflow,发现了许多旨在解决这个问题的问题,但没有一个对我有效。 这是我的问题: 我有这个功能 $.ajaxWS = function (options) { options.url = app.siteUrl + options.url; var data = JSON.stringify(options.data); var defaults = { type: "GET"
$.ajaxWS = function (options) {
options.url = app.siteUrl + options.url;
var data = JSON.stringify(options.data);
var defaults = {
type: "GET",
contentType: "application/json; charset=utf-8",
url: location.protocol + '//' + location.host + location.pathname,
dataType: "json",
cache: false,
crossDomain: true,
data: JSON.stringify(options.data),
converters: {
"text json": function (jsonString) {
var res = JSON.parseNet(jsonString);
if (res && res.hasOwnProperty("d")) res = res.d; //.net 3.5
return res;
}
},
success: function (response, textStatus, XMLHttpRequest) {
options.success(response, textStatus, XMLHttpRequest);
},
error: function (xhr, textStatus, errorThrown) {
if(xhr.status != 0)
options.error(xhr, textStatus, errorThrown);
}
};
var options = $.extend(defaults, options);
return $.ajax(options);
})
当我在字段数据中传递任何字符串时,比如
$.ajaxWS({
url: "urlFunction",
data: { field1: $('#text1').val(), field2: $('#text2').val() },
success: function(){
alert('Success!');
},
error: function(xhr, textStatus, errorThrown){
alert(errorThrown);
}
});
它总是返回这个错误
{"Message":"JSON primitive not valid: field1.","StackTrace":" in System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n in System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n in System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n in System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n in System.Web.Script.Services.RestHandler.GetRawParamsFromGetRequest(HttpContext context, JavaScriptSerializer serializer, WebServiceMethodData methodData)\r\n in System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
我找到了一个以这种方式引用参数的解决方案
data: { field1: "'" + $('#text1').val() + "'", field2: "'" + $('#text2').val() + "'" },
但这只是一个解决办法。
我也经常使用$.ajax选项,比如
processData: false,
traditional: true,
或者不使用
data: JSON.stringify(options.data),
但是只有
data: options.data,
或者把它放在引号之间,但所有这些尝试都不起作用。
我给你另一个信息:这个方法适用于整数和日期。只有字符串会产生问题。
你知道如何解决这个问题吗?
非常感谢。格式错误的JSON可能是您出现问题的原因
JSON解析非常严格。字符串必须始终用双引号括起来。我建议通过传递生成的JSON来发现任何错误。我找到的解决方案是这样的。在POST中传递所有数据
$.ajaxWS = function (options) {
options.url = app.siteUrl + options.url + (app.SessionID?"?ASPSESSID=" + app.SessionID:"");
options.data = JSON.stringify(options.data);
var defaults = {
type: "POST",
contentType: "application/json; charset=utf-8",
url: location.protocol + '//' + location.host + location.pathname,
dataType: "json",
cache: false,
crossDomain: true,
data: {},
converters: {
"text json": function (jsonString) {
var res = JSON.parseNet(jsonString);
if (res && res.hasOwnProperty("d")) res = res.d; //.net 3.5
return res;
}
},
success: function (response, textStatus, XMLHttpRequest) {
options.success(response, textStatus, XMLHttpRequest);
},
error: function (xhr, textStatus, errorThrown) {
if(xhr.status != 0)
options.error(xhr, textStatus, errorThrown);
}
};
var options = $.extend(defaults, options);
return $.ajax(options);
})
并在这一行中添加我的ASP.Net项目的web.config
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS"/>
通过这种方式,我可以不使用单引号悄悄地传递参数。我发现这也有点讨厌。我一直使用JSON.stringify,因为编写所有这些引号会使代码更容易出错。有没有理由不使用带参数的函数?如果没有,请坚持使用有效的方法。没有错误,来自验证程序。试试这个{“field1”:“foo”,“field2”:“foo2”,“field3”:“foo3”}但是如果每个参数都没有单引号,这个就不起作用了。试试这个{“field1”:“foo'”,“field3”:“foo2'”,“field3”:“foo3”}也是一个有效的JSON。我不明白为什么第一个不起作用。参数必须用双引号括起来(正如你粘贴在这里的代码),而不是像你说的那样用单引号括起来。是的,明白了,但单引号仍然不起作用。你能用它设置一个工作的JSFIDLE吗?在精神上解析所有代码是一件非常困难的事情