ajax-метод jQuery с dataType 'json' неправильно анализирует данные json - PullRequest
1 голос
/ 19 февраля 2011

Я использую необъяснимое поведение, используя jQuery 1.4.2, и начинаю думать, что это может быть проблема с сафари, а не проблема с jQuery.Позвольте мне объяснить.

Я начал достаточно просто, используя .getJSON, вот так:

$.getJSON("/challenge/results", form_data, function(data){
  //I know console.log is bad news, just a simplification.
  console.log('data', data); 
}

И журнал дал мне что-то вроде

>locations: Array (1)

ХотяЯ ожидал массив размером 2. Итак, я посмотрел на json в ответе:

{"locations":
[{"customer_id":2,"editable":true,"id":971,"latitude":43.659208,"longitude":-79.407501,"max_zoom":25,"min_zoom":9,"name":"test"},
{"customer_id":3,"editable":true,"id":974,"latitude":36.746944,"longitude":-107.970899,"max_zoom":25,"min_zoom":9,"name":"test2"}]}

Я упростил это ради ясности, но, насколько я могу судить,Полученный json является абсолютно верным (генерируется программно через рельсы).[ Обновление: JSONLint подтверждает эту гипотезу.]

Я был удивлен этим, поэтому я преобразовал свой запрос в запрос $ .ajax, чтобы посмотреть, есть ли между ними какая-то небольшая разница (так какЗатем, просматривая исходный код jQuery, я вижу, что $ .getJSON просто вызывает $ .ajax).

    $.ajax({
        url:"/challenge/results",
        dataType: 'json',
        data: form_data,
        cache:false,
        success: function(data, textStatus){
            console.log("data!", data, textStatus);
        });

Но, увы!Тот же ответ:

location: Array (1) success

На данный момент, я должен признать - я становился немного глупым, поэтому я решил попробоватьчто-то полностью обречено на провал:

    $.ajax({
        url:"/challenge/results",
        dataType: 'text',
        data: form_data,
        cache:false,
        success: function(data, textStatus){
            console.log("Parsed:!", $.parseJSON(data), textStatus);
        });

К моему большому удивлению, моя консоль прочитала:

location: Array (2) success

Я былозадачен.В этот момент я зарылся на каблуках и долго внимательно изучал исходный код jQuery (1.4.2).Полагаю, неудивительно, что функция ajax, похоже, не обрабатывает сам синтаксический анализ json (хотя, должен признать, я не уверен).

Я в полном недоумении, почему это может происходить - любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

попробуйте это:

 // Enables for all serialization
jQuery.ajaxSettings.traditional = true;

// Enables for a single serialization
jQuery.param( stuff, true );

// Enables for a single Ajax requeset
$.ajax({ data: stuff, traditional: true });

эй, похоже, ваша проблема связана с сериализацией вложенных параметров. Просто, как сказано в примечании к выпуску jQuery 1.4:

В Query 1.4 добавлена ​​поддержка сериализации вложенных параметров в jQuery.param с использованием подхода, популярного в PHP и поддерживаемого Ruby on Rails. Например, {foo: ["bar", "baz"]} будет сериализовано как "foo [] = bar & foo [] = baz".

В jQuery 1.3 {foo: ["bar", "baz"]} был сериализован как "foo = bar & foo = baz". Однако не было никакого способа кодировать одноэлементный массив с использованием этого подхода. Если вам нужно старое поведение, вы можете снова включить его, установив традиционную настройку Ajax (глобально через jQuery.ajaxSettings.traditional или в индивидуальном порядке через традиционный флаг).

1 голос
/ 19 февраля 2011

Возможно, я что-то пропустил, но я заметил, что ваш JSON - это объект, имеющий единственное свойство ("locations") с массивом в качестве значения.Вы пробовали:

$.getJSON("/challenge/results", form_data, function(data){
  //I know console.log is bad news, just a simplification.
  console.log('data', data.locations); 
}
0 голосов
/ 14 марта 2011

Вместо ведения журнала консоли следует использовать отладчик инспектора Webkit, который может показать объект в будущем.Это было причиной этой проблемы, поскольку список был урезан в коде после строки console.log, что привело к неожиданному поведению.

...