'#'在JSON中用作$ AJAX url参数问题

时间:2017-07-29 10:30:39

标签: jquery json ajax

以下JQuery ajax调用工作正常。 它传递一个Json字符串作为参数。 正如我所说,这很好。 但是,如果LoadFileSeperator ='#'在服务器上的AJAXSettingsUpdate中收到JSON参数时会被截断。

如何对LoadFileSeperator进行编码,以便它不会截断JSON的任何值?

var jsonQuery = '{"LoadFileSeperator":"' + LoadFileSeperator + '",' +
    '"MakeUpperCase":"' + MakeUpperCase + '",' +
    '"PreAdviceGate":"' + PreAdviceGate + '",' +
    '"PreAdviceRail":"' + PreAdviceRail + '",' +
    '"PreAdviceBirth":"' + PreAdviceBirth + '"' +
    '}';

$.ajax({
    type: "GET",
    url: "/Admin/AJAXSettingsUpdate?jsonstr=" + jsonQuery,
    dataType: "json",
    async: false,
    success: function (result) {
        if (result === "SUCCESS") {
            TypeUpdateSuccess("Updated");
        } else {
            TypeUpdateFail("Failure");
        }
    },
    error: function (x, e) {
        showAlert("ERROR - " + e, "alert-danger");
    }
});

1 个答案:

答案 0 :(得分:2)

您正在执行GET操作并将JSON转储到完全未编码的URL中。当然,它会在第一个无效的URI字符处被截断(#用于引入URI的片段部分。)

您需要对URI中的任何内容进行URI编码:

url: "/Admin/AJAXSettingsUpdate?jsonstr=" + encodeURIComponent(jsonQuery)

旁注:作为John Weisz points out,手工构建JSON字符串容易出错且难以阅读。相反,构造要发送的结构,然后使用JSON.stringify将其转换为JSON:

var jsonQuery = JSON.stringify({
    "LoadFileSeperator": LoadFileSeperator, // Left original spelling here
    "MakeUpperCase": MakeUpperCase,
    "PreAdviceGate": PreAdviceGate,
    "PreAdviceRail": PreAdviceRail,
    "PreAdviceBirth": PreAdviceBirth
});

(在这种情况下,密钥周围的引号是可选的,因为所有这些密钥都是有效的标识符名称,但如果您的密钥不是有效的标识符名称,则包含它们是无害的。)

除了提高可读性之外,它还确保完成所有必要的转义。 (例如,如果这些变量中的任何一个包含"\或换行符或其他任何字符,那么您最终会得到无效的JSON。)

在ES2015中,由于推断的属性名称,它会更简单:

// REQUIRES ES2015 SUPPORT
let jsonQuery = JSON.stringify({
    LoadFileSeperator, // Left original spelling here
    MakeUpperCase,
    PreAdviceGate,
    PreAdviceRail,
    PreAdviceBirth
});

当您使用推断的属性名称时,JavaScript引擎会根据您为其值提供的变量的名称推断(计算出)该属性的名称。

附注2:如果可以,请通过POST发送JSON,而不是GET:

$.ajax({
    type: "POST",
    url: "/Admin/AJAXSettingsUpdate",        // ***
    dataType: "json",
    contentType: "application/json",         // ***
    data: jsonQuery,                         // ***
    async: false,
    success: function(result) {
        if (result === "SUCCESS") {
            TypeUpdateSuccess("Updated");
        }
        else {
            TypeUpdateFail("Failure");

        }
    },
    error: function(x, e) {
        showAlert("ERROR - " + e, "alert-danger");
    }
});

但这需要在服务器端进行更改。