Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON原语在Ajax jQuery调用中无效_Jquery_Json_Ajax - Fatal编程技术网

JSON原语在Ajax jQuery调用中无效

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"

我陷入了这个我无法解决的问题。我尝试了许多解决方案,我也搜索了StackOverflow,发现了许多旨在解决这个问题的问题,但没有一个对我有效。 这是我的问题: 我有这个功能

$.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吗?在精神上解析所有代码是一件非常困难的事情