gpt4 book ai didi

javascript - 如何为 jQuery.ajax 使用不同的 json 解析器?

转载 作者:行者123 更新时间:2023-11-28 01:49:25 24 4
gpt4 key购买 nike

我有带有“标记”值的 json 数据(来自 jsonp 源):

{"foo": "@duration:8542"}

我可以通过将函数作为第二个参数传递给 JSON.parse 来即时解析:

dk.json = {
parse: function (s) {
return JSON.parse(s, function (key, val) {
if (typeof val === 'string' && val[0] === '@') {
var colonpos = val.indexOf(':');
if (colonpos > 1) {
var tag = val.slice(0, colonpos + 1);
switch (tag) {
case dk.Date.tag: return dk.Date.create(val);
case dk.Duration.tag: return dk.Duration.create(val);
}
}
}
return val;
});
},
//...
};

但是如何将此解析函数插入到 jQuery.ajax() 中?比以下更明智的事情:

success: function (data) {
data = dk.json.parse(JSON.stringify(data));
...

dataFilter,尤其是转换器看起来很有前途:

$.ajax({
dataType: 'jsonp',
converters: {
'text json': dk.json.parse
},
// ...
});

但根本不会被调用(dataFilter 被调用,但数据参数设置为未定义)。

我哪里出错了?

[编辑:]

我知道我可以编写一个遍历函数来遍历 jQuery 返回的 JSON 对象,例如:

function untag(val) {
if (typeof val === 'string' && val[0] === '@') {
var colonpos = val.indexOf(':');
if (colonpos > 1) {
var tag = val.slice(0, colonpos + 1);
switch (tag) {
case dk.Date.tag: return dk.Date.create(val);
case dk.Duration.tag: return dk.Duration.create(val);
}
}
}
return val;
}

var untag_json = function (jsonobj) {
var _traverse = function _traverse(obj, result) {
var value;
for (var attr in obj) {
value = obj[attr];
if (value && typeof value === 'object') {
result[attr] = _traverse(value, {});
} else {
result[attr] = untag(value);
}
}
return result;
};

return _traverse(jsonobj, {});
};

然后在成功处理程序中调用它:

success: function (data) {
data = untag_json(data);
...

但这似乎是很多不必要的工作。有没有办法使用 $.ajaxconverters 参数来访问未解析的(即文本) ) json 源?

最佳答案

JSONP 请求 ( src ) 中实际上没有任何 JSON 解析,这看起来有悖常理。发生的情况是,从 JSONP 端点返回的字符串被评估为 JavaScript(引用在 DOM 中定义(或动态添加)的函数,从而发出如下 JSONP 请求:

_callback({'foo':'@duration:8524'});

如果您想使用您的函数,您需要使端点返回一个如下所示的字符串:

_callback("{'foo':'@duration:8524'}");

然后在 JSONP 回调中您可以调用 JSON.parse()。 JSON 解析是一种相当安全的处理 JSON 的方法,因此如果这更容易推理,那么这将是一个很好的方法。

关于javascript - 如何为 jQuery.ajax 使用不同的 json 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com