У меня JSon данные с «меченых» значений (от jsonp
источника):Как использовать другой json-парсер для jQuery.ajax?
{"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 вызывается, но с параметром набора данных не определен) ,
Куда я иду не так?
[Edit:]
Я знаю, что могу написать функцию обхода, которая ходит объект JSON, возвращаемой JQuery, например:
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
, чтобы получить доступ к unparsed (Т.е. текст) json source?
Вы гений :-) Одиночные кавычки недействительны json, поэтому я вернулся (python): 'callback +" (dk.json.parse (% s)) "% json.dumps (json.dumps (значение)) '. Первый «обратный вызов» - это функция 'success', полученная из jQuery, вложенные' json.dumps() 'вызовы сначала преобразуют' значение' в json, а затем json в строку (на самом деле, но я думаю, вы знаете, что я имею в виду) – thebjorn