2013-02-16 3 views
2

У меня есть приложение, которое загружает файл, а затем расшифровывает его, ожидая формат JSON, когда формат в порядке, все идет хорошо. Если я намеренно испортил флэш-файл json, он сообщает об ошибке формата и остановит приложение. Есть ли способ справиться с ошибкой?Есть ли способ проверить JSON перед декодированием?

Код:

import flash.display.Sprite; 
import flash.events.Event; 
import flash.net.URLLoader; 
import flash.net.URLRequest; 

import com.adobe.serialization.json.JSON; 


public class Main extends Sprite 
{ 

    private var _jsonPath:String = "json_example.txt"; 

    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); 

     var loader:URLLoader = new URLLoader(); 
     var request:URLRequest = new URLRequest(); 
     request.url = _jsonPath; 
     loader.addEventListener(Event.COMPLETE, onLoaderComplete); 
     loader.load(request); 
    } 


    private function onLoaderComplete(e:Event):void 
    { 
     var loader:URLLoader = URLLoader(e.target); 
      var jsonArray:Array = JSON.decode(loader.data); 
    } 

Вы видите моя проблема в самом конце, где var jsonArray:Array = JSON.decode(loader.data); Как я могу справиться в моем коде, если это не удается?

ответ

7

Использование попробовать .. поймать ...

import com.adobe.serialization.json.JSONParseError; 

try 
{ 
var jsonArray:Array = JSON.decode(loader.data); 
} 
catch (e:JSONParseError) 
{ 
    //do something 
    trace(e); 
} 
finally 
{ 
} 

Это решение использует as3corelib (http://as3corelib.googlecode.com/), если вы используете JSON.parse(), пожалуйста, проверьте ответ от JayC

+0

, который дает мне: Сцена 1, «Конфигурация и загрузка данных», Кадр 1, Строка 37 \t 1046: Тип не был найден или не был константой времени компиляции: JSONParseError. – DomingoSL

+0

JayC уже упомянул об этом, лучше использовать TypeError. Я использую as3corelib (http://as3corelib.googlecode.com), который определяет JSONParseError. – Thorsten

+0

Привет от будущего! Это невероятно облагается налогом, когда нужно многократно пытаться использовать URLStream. Есть ли способ лучше? Самое лучшее, что я могу придумать, это сравнить скобки и проверять только тогда, когда каждый байт доступен. – quantomworks

3

Actionscript Suppports попробовать/поймать , Согласно http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/JSON.html, parse выбрасывает TypeError при неисправности. Так это выглядит как что-то вроде

try 
{ 
    var jsonArray:Array = JSON.parse(loader.data); 
} 
catch (e:TypeError) 
{ 
    //do something 
} 
catch (e: SomethingOtherError) //not being literal here, just showing 
//you can catch more than one type of exception 
{ 

} 
finally 
{ 
    //finally always works, even if the exception is not caught above 
} 

(изм)

Приведенный выше код не нужен ваш import com.adobe.serialization.json.JSON;

JSONParseError Торстен упоминает, кажется, из mixpanel библиотека as3corelib библиотеки https://github.com/mikechambers/as3corelib/ который использует JSONDecoder для десериализации https://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/serialization/json/JSONDecoder.as

H OWEVER, если вы хотите по-прежнему использовать библиотеку as3corelib по какой-либо причине, чтобы заставить работать код Торстен, все, что вам нужно (IIRC), должно быть import com.adobe.serialization.json.JSONParseError;.

+0

Сделав это, я все равно получаю сообщение об ошибке, которое блокирует приложение: JSONParseError: Неожиданное с (где «s» - намеренно помещенная ошибка, чтобы испортить json-файл) – DomingoSL

+0

Также вы говорите о разборе, но в вашем примере вы используете decode – DomingoSL

+0

э, да, я немного ленив, я имел в виду 'JSON.parse'. Однако для использования JSON.parse вам придется удалить импорт класса as3corelib JSON. – JayC

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