2013-11-10 3 views
0

У меня 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?

ответ

1

Там на самом деле нет никакого JSON синтаксического анализа в JSONP запрос (src), который может казаться противостоящим интуитивно понятным. То, что происходит это строка, которая возвращается из конечной точки JSONP оценивается как JavaScript (со ссылкой на функцию, которая определена (или добавленным в динамически) в DOM делает запрос JSONP так:

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

Если вы хотите использовать функцию вам необходимо будет сделать конечной точкой возвращать строку, как это:.

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

затем в обратном вызове JSONP вы могли бы назвать JSON.parse() JSON синтаксического анализа является довольно безопасным способом обрабатывать JSON, так что если это было легче рассуждать, тогда это был бы прекрасный подход.

+1

Вы гений :-) Одиночные кавычки недействительны json, поэтому я вернулся (python): 'callback +" (dk.json.parse (% s)) "% json.dumps (json.dumps (значение)) '. Первый «обратный вызов» - это функция 'success', полученная из jQuery, вложенные' json.dumps() 'вызовы сначала преобразуют' значение' в json, а затем json в строку (на самом деле, но я думаю, вы знаете, что я имею в виду) – thebjorn

0

Привет, вам нужно установить это приложение-заголовок/json в ответ со стороны сервера, тогда вы можете просто установить dataType: json или dataType: jsonp, тогда вам не нужно будет строгать или разбирать json. Затем вы просто получаете объекты, свойства или массивы из json.

Например: в PHP мы используем

$json_string = "{"foo": "@duration:8542"}"; 
$json = json_decode($json_string); 
$foo = $json->foo; 
echo $foo;//prints @duration:8542 

В JQuery вы можете сделать это:

sucess:function(response) { 
    var foo = response.foo; 
    console.log(foo); 
} 

Надеется, что это помогает

+0

Я думаю, вы неправильно поняли ...Я хочу, чтобы проанализированный json был объектом, подобным '{foo: dk.Duration.create ('@ duration: 8524')}' т. Е. Строка '@duration: 8524' должна быть преобразована в dk. Объект длительности во время разбора json. – thebjorn

+0

Функция jQuery выводит только строку «@duration: 8542», которая не является 'isinstance' из' dk.Duration' ... – thebjorn

+0

, что произойдет, если вы передадите это значение в 'dk.Duration.create()' my предположим, он может создать этот экземпляр из значения. –

Смежные вопросы