我有带有“标记”值的 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
,尤其是converters
看起来很有希望:
$.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
处理程序中调用它:
success: function (data) {
data = untag_json(data);
...
但这似乎是很多不必要的工作。有没有办法使用converters
参数来$.ajax
访问未解析(即文本)的 json 源?