我有AJAX响应,其中所有key,value
对都被引用了。我想从任何数字值中删除引号。对于所有AJAX请求,我都需要以最小的努力在全球范围内完成。
我对大多数请求都使用jQuery.getJSON
,并且我想要一个不需要单独调整每个当前AJAX请求的解决方案。 (我不想在每个现有的JSON.parse(text,myreviver)
通话中添加一个$.getJSON
通话。)
例如:
Received: {"age":"31", "money": "-1.329"}
Want: {"age": 31, "money": -1.329}
对于所有AJAX请求,我该怎么做?
我当前的最终目标是使用JSON.parse(text, reviver)
处理数据(感谢this question)。不过,我不知道如何将其连接到jQuery.ajax
中。
我尝试使用ajaxSuccess()
,但似乎没有链式处理任何数据。例如:
$(document.ajaxSuccess) ( function(j) {
JSON.parse(j, myReviver);
}
.getJSON(url, data, function(j) {
// The data in this success function has not been through myReviver.
}
我如何:
jQuery.getJSON
中使用齐磊功能,或者success
函数之前处理AJAX响应,然后再到达其他成功函数? 答案 0 :(得分:1)
您可以使用自己的方法覆盖.getJSON
。
原生getJSON
方法可以在这里看到:
https://j11y.io/jquery/#v=git&fn=jQuery.getJSON
function (url, data, callback) {
return jQuery.get(url, data, callback, "json");
}
这很简单,只需将传递给getJSON
的回调,使用jQuery.get
而不是'text'
的 own 回调传递给'json'
,使用自定义的reviver解析JSON,然后调用原始回调。
一个复杂的问题是,传递给getJSON
的第二个参数是可选的(随请求一起发送的数据)。
假设您始终使用成功函数(第三个参数和最后一个参数),则可以使用rest参数和pop()
来获取传递的成功函数。创建一个使用文本响应并使用自定义JSON.parse
的自定义成功函数,然后使用创建的对象调用传递的成功函数。
const dequoteDigits = json => JSON.parse(
json,
(key, val) => (
typeof val === 'string' && /^[+-]?[0-9]+(?:\.[0-9]+)$/.test(val)
? Number(val)
: val
)
);
jQuery.getJSON = function (url, ...rest) {
// normal parameters: url, data (optional), success
const success = rest.pop();
const customSuccess = function(textResponse, status, jqXHR) {
const obj = dequoteDigits(textResponse);
success.call(this, obj, status, jqXHR);
};
// spread the possibly-empty empty array "rest" to put "data" into argument list
return jQuery.get(url, ...rest, customSuccess, 'text');
};
jQuery.getJSON('https://jsonplaceholder.typicode.com/users', (obj) => {
console.log(obj);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
上面的代码段输出与所请求的URL的区别
https://jsonplaceholder.typicode.com/users
是经度和纬度属性值已转换为数字,而不是其余字符串。
如果您也使用await
而没有成功回调,那么您将需要覆盖返回的Promise的then
属性,尽管处理可选的成功回调会使代码的逻辑成为可能更加丑陋:
const dequoteDigits = json => JSON.parse(
json,
(key, val) => (
typeof val === 'string' && /^[+-]?[0-9]+(?:\.[0-9]+)$/.test(val)
? Number(val)
: val
)
);
jQuery.getJSON = function (url, ...rest) {
// normal parameters: url, data (optional), success (optional)
const data = rest.length && typeof rest[0] !== 'function'
? [rest.shift()]
: [];
const newSuccessArr = typeof rest[0] === 'function'
? [function(textResponse, status, jqXHR) {
const obj = dequoteDigits(textResponse);
rest[0].call(this, obj, status, jqXHR);
}
]
: [];
// spread the possibly-empty dataObj and newSuccessObj into the new argument list array
const newArgs = [url, ...data, ...newSuccessArr, 'text'];
const prom = jQuery.get.apply(this, newArgs);
const nativeThen = prom.then;
prom.then = function(resolve) {
nativeThen.call(this)
.then((res) => {
const obj = dequoteDigits(this.responseText);
resolve(obj);
});
};
return prom;
};
jQuery.getJSON('https://jsonplaceholder.typicode.com/users', (obj) => {
console.log(obj[0].address.geo);
});
(async () => {
const obj = await jQuery.getJSON('https://jsonplaceholder.typicode.com/users');
console.log(obj[0].address.geo);
// console.log(obj);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
答案 1 :(得分:0)