【问题标题】:Returning control codes as JSON to a jquery ajax json call将控制代码作为 JSON 返回到 jquery ajax json 调用
【发布时间】:2013-06-28 09:54:48
【问题描述】:

我想知道是否可以将 JSON 格式的 ascii 控制代码从经典 ASP 返回到 jQuery ajax 调用。

这是我的 jQuery 调用:

$.ajax({
    url: "/jsontest.asp",
    type: "POST",
    cache: false,
    dataType: "json",
    complete: function(data)
    {
        var o = $.parseJSON(data.responseText.toString());
    },
    error: function(data1, data2)
    {
        alert("There has been an error - please try again");
    }
});

这是我调用的页面:

{"val1":123,"val2":"abcdef"}

以上工作正常,但如果我将调用页面更改为包含 ascii 字符 31 (1F),如下所示:

{"val1":123,"val2","abc\x1Fdef"}

然后我在错误函数中收到警报。可以这样做吗,如果可以,请问怎么做。

注意:我使用的是 jQuery 1.7.1 以及 IIS 6 和 IIS 7

我尝试过:\x1f、%1f 和 \u001f

查看 data1 和 data2 中的值。

data2 有字符串“parsererror”

data1 是一个具有以下属性的对象:

readyState: 4
setRequestHeader: function (a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this}
getAllResponseHeaders: function (){return s===2?n:null}
getResponseHeader: function (a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c}
overrideMimeType: function (a){s||(d.mimeType=a);return this}
abort: function (a){a=a||"abort",p&&p.abort(a),w(0,a);return this}
done: function (){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this}
fail: function (){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this}
progress: function (){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this}
state: function (){return e}
isResolved: function (){return!!e}
isRejected: function (){return!!e}
then: function (a,b,c){i.done(a).fail(b).progress(c);return this}
always: function (){i.done.apply(i,arguments).fail.apply(i,arguments);return this}
pipe: function (a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()}
promise: function (a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}
success: function (){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this}
error: function (){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this}
complete: function (){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this}
statusCode: function (a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this}
responseText: {"val1":123,"val2":"abcdef"}
status: 200
statusText: OK

【问题讨论】:

  • 你试过双斜线吗? {"val1":123,"val2","abc\\x1Fdef"}
  • 我现在有了,它返回一个实际的斜线,后跟字符 x1f
  • 阅读RFC:ietf.org/rfc/rfc4627.tx如果我没有误会,应该是:{"val1":123,"val2","abc%x1F /def"}
  • 刚刚试过了,只是返回字符 %xf1
  • 哎呀!,让我们继续阅读吧:)

标签: jquery json asp-classic


【解决方案1】:

首先,尝试使用不同的 ascii 代码。字符1F 是“单位分隔符”。 (无法打印)。检查here

[编辑:试试\x20。这是一个空间。]

[编辑 2:由于您想要单位分隔符,而 jQuery.parseJSON 似乎不喜欢它,我们将使用eval()

现在,将 dataType 指定为 'json' 将解析来自服务器的响应;无需自己手动解析: 我们将dataType 指定为“文本”并使用eval() 手动解析json:

$.ajax({
    url: "/jsontest.asp",
    type: "POST",
    cache: false,
    dataType: "text",
    success: function(data)
    {
        // data is "{"val1":123,"val2":"abc\x1Fdef"}"
        var o = eval("(" + data + ')'); // parse json

        // will split the text using \x1F as delimiter
        var separated = o.val2.split('\x1F');
        // separated is now ["abc","def"]
    },
    error: function(data)
    {
        alert("There has been an error - please try again");
    }
});

【讨论】:

  • 关于冒号的有效点 - 我原来的问题中的错字 - 现在更正了。但是,这是我想要的单位分隔符,其他不可打印的字符,如 \n 和 \r 工作
  • 另外,如果我不解析它,那么 o.val1 返回 undefined
  • 好的,我已经编辑了我的答案。现在使用 dataType 'text',并使用 eval 来解析 json。
【解决方案2】:

我将 ajax 调用的数据类型更改为“文本”,并在 parseJSON 调用“字符串文字中的错误控制字符”时出现 javascript 错误。

所以它似乎无法完成,所以我使用了一些 X1F,当 ajax 调用返回时,我将其替换为 ascii 31。

【讨论】:

  • 请看我更新的代码。它不使用 parseJSON。相反,我使用了 eval()。为我工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多