「タグ付き」の値を持つjsonデータがあります(jsonp
ソースから):
{"foo": "@duration:8542"}
JSON.parse の 2 番目の引数として関数を渡すことで、オンザフライで解析できます。
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 は呼び出されますが、data パラメーターは undefined に設定されています)。
どこが間違っていますか?
[編集:]
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 ソースにアクセスする方法はありませんか?