JSON-массив возвращает пустое значение с помощью appcelerator / titanium - PullRequest
1 голос
/ 31 мая 2011

Я сейчас пишу приложение для iPhone, используя Appcelerator's Titanium.Одно из требований приложения заключается в том, чтобы иметь возможность извлекать массив JSON недавно воспроизведенных песен и отображать его в виде таблицы.

У меня есть отдельная вкладка в приложении, которая без проблем анализирует JSON из TwitterОднако, независимо от того, что я делаю, я не могу заставить appcelerator проанализировать мой сгенерированный json.

JSON генерируется файлом PHP, расположенным на моем сервере, с помощью json_encode ();

Это мойjson:

[
    {
        "title": "Cramp Pres. Sliders - Meteor"
    },
    {
        "title": "Progressiver pres. FineSky - Fine Sky"
    },
    {
        "title": "Armin Van Buuren #x26; DJ Shah feat. Chris Jones - Going Wrong (Alex M.O.R.P.H #x26; Woody Van Eyden Remix)"
    },
    {
        "title": "Bart Claessen - Hartseer"
    },
    {
        "title": "Will Holland feat. Jeza - Start Again (Juventa Remix)"
    }
]

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

Это мой JS:

var loader = Ti.Network.createHTTPClient();
loader.setTimeout(10000);

loader.open("GET","http://myurl.com/service/played.json");

loader.onload = function()
{
    // Ti.API.info writes information to the debug console.
    Titanium.API.info('Loaded! Status: ' + this.status);
    Titanium.API.info('Response Header: ' + this.getResponseHeader('Content-Type'));
    Titanium.API.info('Response Text: ' + this.responseText);
}

loader.send();

В приложении, однако, responseText просто возвращается как [] - вот и все.Ничего больше.Я проверил структуру моего JSON и JSON, которые возвращает API Twitter, и оба они выглядят примерно одинаково, только API Twitter возвращается с гораздо большей информацией, как вы можете себе представить.

Вот шаги, которые я попробовал:

  1. Я сохранил сгенерированный PHP JSON в текстовый файл с именем «test.json» и попытался его проанализировать. Это сработало нормально!

  2. Ранее веб-сервис, который я писал, требовал строку запроса? Action = Play.Я удалил это, чтобы убедиться, что я определенно получаю массив JSON.Это не имеет значения

  3. Я отправил заголовки в PHP для текста / обычного И приложения / JSON безрезультатно

  4. Наконец, я нанялmod_rewrite на моем сервере, чтобы я мог обрабатывать выходные данные веб-службы в виде файла json. Т.е. plays.json - все равно пустой массив.

Я просто чувствую, что я 'Я постоянно бьюсь головой о кирпичную стену и буду признателен за понимание некоторых людей с меньшим стрессом:)

Любая помощь будет с благодарностью!

С уважением,

Дейв

Дополнительная информация: Из проверки заголовков http я обнаружил, что возвращаемая длина содержимого всегда равна 2. Однако, просматривая страницу в браузере или сгенерированный файл .json, показывает полный массив JSON.

Как и предполагалось ранее, это, похоже, сводится к проблеме, связанной с PHP.Сценарий работает очень просто.Он запрашивает таблицу MySQL, чтобы получить список песен.Зацикливаясь в массиве, он заполняет массив, который называется $ songs

. В конце функции я просто использую:

echo json_encode($songs);

Еще больше информации Если яудалите заголовок типа содержимого и просмотрите страницу в браузере, я получу массив JSON. Если я затем скопирую его и вставлю в конец моего файла PHP, после закрывающего тега отобразятся данные, которые я вставляю.

Ответы [ 4 ]

1 голос
/ 01 июня 2011

Спасибо за ответы всем.

Я провел дальнейшие исследования и обнаружил, что проблема, похоже, связана с тем, как мой PHP-скрипт создавал массив JSON.

Хотя JSON проверен,и был виден как в браузере, так и в файле .json, который я генерировал, по какой-то причине он не создавался?Действительно странно, и я до сих пор не могу разобраться с этим.

Однако я решил, что проблема может заключаться в том, как я анализировал XML-ленту, предоставляющую информацию о песне.Как ни странно, это произошло.Код, который я ранее использовал на своем веб-сайте, работает отлично, но appcelerator он немного не понравился.

Так что я взял XML-канал и провел его через simplexml_load_string () и смог использовать его напрямуюв функции php json_encode ().БАМ ... Это сработало.

Спасибо, что вы, ребята, потратили время, это действительно ценится!

Дейв

0 голосов
/ 31 мая 2011

Попробуйте приведенный ниже код, это именно то, что я использую.

var xhr = Titanium.Network.createHTTPClient();

xhr.onload = function () {
  try {
    var returned = JSON.parse(this.responseText);
  } catch (e) {
    Ti.API.debug("Unable to parse JSON from: "+url);
  }

  Ti.API.debug(returned);
};

xhr.open("GET", url, false);
xhr.send();

Также убедитесь, что вы используете последнюю версию Ti SDK 1.6.2 У меня была похожая проблема с более ранней версией.И прежде чем запускать этот код (но после его добавления), удалите папку сборки, чтобы заставить Ti полностью перестроить проект.

0 голосов
/ 31 мая 2011

Я бы предложил несколько изменений, которые могли бы дать некоторую дополнительную информацию

этот код

loader.setTimeout(10000);

должен быть таким

loader.setTimeout([10000]);

, и я бы также добавилобработчик ошибок для httpClient, чтобы увидеть, есть ли еще интересные данные, возвращающиеся с сервера

loader.onerror = function(e) {
    Ti.API.error(e);
}
0 голосов
/ 31 мая 2011

Согласно документации API вам просто нужно немного переключить порядок.

onload - "установите это значение на функцию перед вызовом open , чтобы вызвать функциючтобы вызвать успешный ответ "

Appcelerator Titanium имеет тонны этих скрытых препятствий: - (

...