Показать сообщение отдельно
Старый 23.10.2012, 22:20
soundy_flash вне форума Посмотреть профиль Отправить личное сообщение для soundy_flash Найти все сообщения от soundy_flash
  № 1  
Ответить с цитированием
soundy_flash

Регистрация: Sep 2012
Сообщений: 7
По умолчанию Взаимодействие с API ВКонтакте. Обработка JSON-ответов.

Здравствуйте, коллеги.

Ради интереса, решил изучить ВКонтакте API, но достаточно быстро застопорился.

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

Код AS3:
package vkApiTest
{
	import flash.display.JointStyle;
	import flash.display.Sprite;
	import flash.events.*;
	import flash.text.*;
 
	import vk.APIConnection;
 
	public class Main extends Sprite 
	{
		private var tF:TextField = new TextField();
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			var flashVars:Object = stage.loaderInfo.parameters as Object;
			var VK:APIConnection = new APIConnection(flashVars);
 
			if (!flashVars.api_id)
			{
				// -- For local testing enter you test-code here: 
				flashVars['api_id'] = 1888171; 
				flashVars['viewer_id'] = 66748; 
				flashVars['sid'] = "7e22c25d7fece88f2316553937ff24f43e1073ca28e8b4302e65db35fa"; 
				flashVars['secret'] = "6113n3e4g3";
				// -- // 
			}
 
			tF.type = TextFieldType.DYNAMIC;
			tF.border = true;
			tF.width = 200;
			tF.height = 200;
			addChild(tF);
 
 
			VK.api('storage.set', { key:'var', value:'example' } );
			VK.api('storage.get', { key:'var' }, completeFunc, errorFunc);
 
			function completeFunc(vkObj:Object):void {
				tF.appendText("completeFunc сработала");
				if (vkObj[0] == "example")
				{
					tF.appendText("Работает!");
				}
				else
				{
					tF.appendText("Работает, но не так...");
				}
			}
 
			function errorFunc(vkObj:Object):void {
				tF.appendText("Ошибка");
			}
		}
 
	}
 
}
Всё время выходит какая-то белиберда.

Это приложение заливается в Контакт. Дальше просто запускается. Если приложение "отключено", то в textField'e появляется сообщение "Ошибка", то есть срабатывает функция errorFunc. Если приложение "включено и видно всем", то в текстовом поле появляется "completeFunc сработала". Окей, я в правильном направлении.

Но вот как получить доступ к возвращённому функцией значению? Обращаюсь к официальному руководству по API:

http://vk.com/pages?oid=-1&p=storage.get

Ничего не проясняется... Да, функция возвращает значение. Но в каком виде? Я так понимаю, что в виде переменной экземпляра объекта, который передаётся в мою функцию completeFunc.

Возможно ошибка где-то в синтаксисе. Чтобы понять, как правильно обратить к возвращаемому значению я читал:
http://www.flasher.ru/forum/showthread.php?t=181260 - эту тему на форуме. Пробовал:
Код AS3:
if (vkObj[0] == "example")
ничего...
http://vk.com/topic-1_21972158 - искал в этой теме по ключевому слову "storage.get".
http://vk.com/topic-2226515_3507340 - искал в этой теме по тому же ключевому слову.
Пробовал:
vkObj.response
vkObj['response']
vkObj.data
vkObj.['data']
vkObj[0]

В общем что-то ничего не получается. Прошу объяснить мне, что не так и, если возможно, привести работающие примеры. Если что-то из списка выше того, что я пробовал, на самом деле верно, то укажите мне на это. Буду искать у себя ошибку.

П.С. И как бы мне просмотреть все переменные экземпляра у объекта и вывести их имена и значения?

Добавлено через 19 часов 9 минут
Много узнал про JSON, но всё-равно ничего не понимается.

Итак, возвращается значение в виде:

Код:
{"response":"example"}
Моя функция completeFunc в качестве аргумента получает декодированную JSON-строки в виде объекта, который присваивается переменной vkObj. Значит у этого объекта должна быть переменная экземпляра "response" со значением "example".
Внёс изменения в код, чтобы выполнить метод "encode" над vkObj и посмотреть JSON-строку в первоначальном виде:

Код AS3:
VK.api('storage.set', { key:'var', value:'example' } );
VK.api('storage.get', { key:'var' }, completeFunc, errorFunc);
 
function completeFunc(vkObj:Object):void {
	var data:String = JSON.encode(vkObj);
	tF.appendText(data);
	if (data == "example")
	{
		tF.appendText("Работает!");
	}
	else
	{
		tF.appendText("\nРаботает, но не так...");
	}
}
function errorFunc(vkObj:Object):void {
	tF.appendText("Ошибка");
}
В результате вывод выглядит так:
Цитата:
"example"
Работает, но не так...
??
Почему же выводится просто "example" (да еще и в кавычках), а не {"response":"example"}?

Что я делаю не так и как же мне всё-таки получить значение переменной, возвращаемое методом storage.get?


Последний раз редактировалось soundy_flash; 24.10.2012 в 19:25. Причина: Уточнение заголовка.