Javascript 在jQuery.ajax请求中使用reviver函数

Javascript 在jQuery.ajax请求中使用reviver函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有AJAX响应,其中引用了所有键、值对。我想从任何数值中删除引号。对于所有AJAX请求,我需要以最小的工作量在全局范围内完成这项工作 我使用的是大多数请求,我想要一个不需要单独调整当前每个AJAX请求的解决方案。(我不想在每个现有的$.getJSON调用中添加JSON.parse(text,myreviver)调用。) 例如: Received: {"age":"31", "money": "-1.329"} Want: {"age": 31, "money": -1.32

我有AJAX响应,其中引用了所有
键、值
对。我想从任何数值中删除引号。对于所有AJAX请求,我需要以最小的工作量在全局范围内完成这项工作

我使用的是大多数请求,我想要一个不需要单独调整当前每个AJAX请求的解决方案。(我不想在每个现有的
$.getJSON
调用中添加
JSON.parse(text,myreviver)
调用。)

例如:

Received:    {"age":"31", "money": "-1.329"}
Want:        {"age": 31, "money": -1.329}
$(document.ajaxSuccess) ( function(j) {
    JSON.parse(j, myReviver);
}

.getJSON(url, data, function(j) {
    // The data in this success function has not been through myReviver.
}
对于所有AJAX请求,我如何做到这一点

我目前的最终目标是使用来处理数据(感谢)。不过,我不知道如何将其连接到
jQuery.ajax

我尝试过使用,但它似乎无法处理任何数据。例如:

Received:    {"age":"31", "money": "-1.329"}
Want:        {"age": 31, "money": -1.329}
$(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响应
您可以使用自己的方法覆盖
.getJSON

本地
getJSON
方法可以在这里看到:

将回调传递给
getJSON
,将自己的回调传递给
jQuery,这是一件非常简单的事情。使用
'text'
而不是
'json'
获取
,使用自定义恢复程序解析json,然后调用原始回调

一个复杂的问题是传递给
getJSON
的第二个参数是可选的(随请求发送的数据)

假设您总是使用success函数(第三个也是最后一个参数),您可以使用rest参数和
pop()
来获得传递的success函数。创建一个自定义成功函数,该函数接受文本响应并使用自定义的
JSON.parse
,然后使用创建的对象调用传递的成功函数

const dequoteDigits=json=>json.parse(
json,
(键,val)=>(
typeof val=='string'&&/^[+-]?[0-9]+(?:\[0-9]+)$/.test(val)
?编号(val)
:val
)
);
jQuery.getJSON=函数(url,…rest){
//正常参数:url、数据(可选)、成功
const success=rest.pop();
const customSuccess=函数(textResponse、status、jqXHR){
const obj=dequoteDigits(textResponse);
success.call(this、obj、status、jqXHR);
};
//将可能为空的数组“rest”展开,将“data”放入参数列表中
返回jQuery.get(url,…rest,customSuccess,'text');
};
jQuery.getJSON('https://jsonplaceholder.typicode.com/users',(obj)=>{
控制台日志(obj);
});

您可以使用“对所有AJAX请求,以最小的工作量全局覆盖默认文本到json转换器”

$.ajaxSetup({
转换器:{
//默认值为jQuery.parseJSON
“文本json”:数据=>json.parse(数据,numberrevier)
}
})
$.getJSON('https://jsonplaceholder.typicode.com/users')
.then(users=>users.map(user=>({email:user.email,geo:user.address.geo})))
.then(console.log)
函数号生存(名称、值){
如果(值的类型=='string'&&/^[+-]?[0-9]+(?:\[0-9]+)$/.test(值)){
log(`Using custom reviver for${name}:${value}`)
值=数字(值)
}
返回值
}
我没有想到这一点——我被困在追求
ajaxSuccess
路线的路上。这看起来更干净。我最终实现了一个
数据过滤器
,尽管它也有自己的潜在问题。谢谢你的主意!