Вход

Просмотр полной версии : [Вконтакте] Ошибка в API при компиляции приложения.


AntiVIRUZ
14.08.2012, 16:46
Когда пытаюсь скомпилировать любое приложение с использованием API выскакивает ошибка
col: 22 Error: Access of undefined property JSON.
(пишу в FlashDevelop). Ошибка в файле DataProvider.as. Вот его код места ошибки: (4 строка)

loader.addEventListener(Event.COMPLETE, function(e:Event):void{
var loader:URLLoader = URLLoader(e.target);
trace(loader.data);
var data: Object = JSON.decode(loader.data);
if (data.error) {
options.onError(data.error);
} else if (options.onComplete && data.response) {
options.onComplete(data.response);
}
});
try {
loader.load(request);
}
catch (error:Error) {
options.onError(error);
}
}


Что с этим делать?

Вот еще код самой программы (Пытался скомпилировать пример из инета, но и все остальные программы ту же ошибку выдавали)

package
{
import flash.display.Sprite;
import flash.events.*;
import vk.APIConnection;
import vk.events.*;

public class Main extends Sprite
{
public var api_id:Number;
public var viewer_id:Number;
public var sid:String;
public var secret:String;

public function Main()
{
// получаем flashVars
var flashVars:Object = stage.loaderInfo.parameters as Object;
// присваиваем переменным значения из flashVars
api_id = flashVars['api_id'];
viewer_id = flashVars['viewer_id'];
sid = flashVars['sid'];
secret = flashVars['secret'];

// для тестирования локально, вводим свои данные здесь и раскоменчиваем код
/*flashVars['api_id'] = 1728947;
flashVars['viewer_id'] = 1306422;
flashVars['sid'] = 'a1006fd1e8gb9bd669e1119280166bc6cb9110b8a111550333bf041301';
flashVars['secret'] = '7ef8l6a4p8';
*/

// инициализация
var VK:APIConnection = new APIConnection(flashVars);
// выполняем запрос getProfiles, в качестве параметра uids используем id пользователя, просматривающего приложения, в параметре fields указываем photo_big - большая фотография пользователя
VK.api('getProfiles', { uids: flashVars['viewer_id'],fields:'photo_big' }, onProfileLoaded, onError);
}

// данные получены
private function onProfileLoaded(data: Object):void
{
// обрабатываем полученный ответ
data.result_tf.text = data[0]['uid'] + ' ' + data[0]['first_name'] + ' ' + data[0]['last_name'] + ' ' + data[0]['photo_big'];
}

// если произошла ошибка
private function onError(data: Object):void
{
data.result_tf.text = data.error_msg;
}
}
}

caseyryan
14.08.2012, 16:55
Компилятор же явно указал на ошибку.
Класс JSON надо сначала импортировать

import vk.api.serialization.json.JSON;

Вообще, FD умеет сама хорошо импортировать разные классы. Но если этого, по какой-то причине, не произошло автоматически (возможно из-за копипаста кода), то нужно установить курсор на название класса, который нужно импортировать и нажать Ctrl + Shift + 1

AntiVIRUZ
14.08.2012, 17:04
но в нем уже существует импорт

import vk.api.serialization.json.*;

Вообще вот листинг всего класса API

package vk.api {

import flash.net.*;
import flash.errors.*;
import flash.events.*;

import vk.api.serialization.json.*;

public class DataProvider {
private var _api_sid: String;
private var _api_url: String = "http://api.vkontakte.ru/api.php";
private var _api_id: Number;
private var _api_secret: String;
private var _viewer_id: Number;
private var _request_params: Array;

private var _global_options: Object;



public function DataProvider(api_url: String, api_id: Number, api_sid: String, api_secret: String, viewer_id: Number) {
_api_secret = api_secret;
_api_sid = api_sid;
_api_url = api_url;
_api_id = api_id;
_viewer_id = viewer_id;
}

public function setup(options: Object): void {
_global_options = options;
}

public function request(method: String, options: Object = null):void {
var onComplete: Function, onError: Function;
if (options == null) {
options = new Object();
}
options.onComplete = options.onComplete ? options.onComplete : (_global_options.onComplete ? _global_options.onComplete : null);
options.onError = options.onError ? options.onError : (_global_options.onError ? _global_options.onError : null);
_sendRequest(method, options);
}



/********************
* Private methods
********************/

private function _sendRequest(method:String, options:Object):void {
var self:Object = this;

var request_params: Object = {method: method};
request_params.api_id = _api_id;
request_params.format = "JSON";
request_params.v = "3.0";
if (options.params) {
for (var i: String in options.params) {
request_params[i] = options.params[i];
}
}

var variables:URLVariables = new URLVariables();
for (var j: String in request_params) {
variables[j] = request_params[j];
}
variables['sig'] = _generate_signature(request_params);
variables['sid'] = _api_sid;
var request:URLRequest = new URLRequest();
request.url = _api_url;
request.method = URLRequestMethod.POST;
request.data = variables;

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
if (options.onError) {
loader.addEventListener(IOErrorEvent.IO_ERROR, function():void {
options.onError("Connection error occured");
});
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function():void {
options.onError("Security error occured");
});
}

loader.addEventListener(Event.COMPLETE, function(e:Event):void{
var loader:URLLoader = URLLoader(e.target);
trace(loader.data);
var data: Object = JSON.decode(loader.data);
if (data.error) {
options.onError(data.error);
} else if (options.onComplete && data.response) {
options.onComplete(data.response);
}
});
try {
loader.load(request);
}
catch (error:Error) {
options.onError(error);
}
}

/**
* Generates signature
*
*/
private function _generate_signature(request_params: Object): String {
var signature: String = "";
var sorted_array: Array = new Array();
for (var key: String in request_params) {
sorted_array.push(key + "=" + request_params[key]);
}
sorted_array.sort();

// Note: make sure that the signature parameter is not already included in
// request_params array.
for (key in sorted_array) {
signature += sorted_array[key];
}
if (_viewer_id > 0) signature = _viewer_id.toString() + signature;
signature += _api_secret;
return MD5.encrypt(signature);
}
}
}

caseyryan
14.08.2012, 17:49
Помнится был у меня как-то конфликт классов, когда адоби на кой-то добавили нативный класс JSON во флеш плеер.
Я просто переименовал все классы сожержащие JSON в директории APIConnection. Т.е. сделал JSON -> Json
Во вложении уже переименованные классы. Возможно тут та же проблема

так же можно вместо
JSON.decode(loader.data)
прописать полный путь

vk.api.serialization.json.JSON.decode(loader.data)

чисто для проверки

AntiVIRUZ
14.08.2012, 17:58
спасибо большое, когда прописал полный путь все заработало.