2016-11-04 2 views
3

В AS3 я мог вставлять файл JSON следующим образом:Вставить Json файл в проекте

[Embed(source = "controllers.json", mimeType='application/octet-stream')] 
private static const JSON_CONTROLLERS:Class; 

Есть эквивалентный способ сделать это в Haxe?

Если нет, то каковы мои варианты?

ответ

3

Если вы используете OpenFL, есть два варианта:

  • использование @:file метаданных:

    @:file("controllers.json") 
    class JsonControllers extends openfl.utils.ByteArray.ByteArrayData {} 
    
    class Main extends openfl.display.Sprite { 
        public function new() { 
         super(); 
         trace(new JsonControllers()); 
        } 
    } 
    

    Вы также можете сделать это с чистой Haxe, но только на цели швейцарских франков. OpenFL делает эту работу по всем целям.

  • использование openfl.Assets:

    Включить папку активов в файле project.xml/application.xml:

    <assets path="assets" /> 
    

    доступ к содержимому файла:

    trace(openfl.Assets.getText("assets/controllers.json")); 
    

С чистого Haxe, вы Возможно, вы захотите использовать -resource - проверьте пример использования Haxe Manual.

1

Помимо решений Gama11, есть еще один вариант: использовать макросы! ;)

compiletime haxelib имеет точную функцию макросъемки, которая считывает файл JSON в качестве объекта во время компиляции:

var jsonObject = CompileTime.parseJsonFile("test.json"); 

source code of parseJsonFile очень просто, и я рекомендую прочитать его, чтобы узнать, как Haxe макросы Работа. Для удобства ознакомьтесь с соответствующими частями:

macro public static function parseJsonFile(path:String):ExprOf<{}> { 
    var content = loadFileAsString(path); 
    var obj = try Json.parse(content) catch (e:Dynamic) { 
     haxe.macro.Context.error('Json from $path failed to validate: $e', Context.currentPos()); 
    } 
    return toExpr(obj); 
} 

static function loadFileAsString(path:String) { 
    try { 
     var p = Context.resolvePath(path); 
     Context.registerModuleDependency(Context.getLocalModule(),p); 
     return sys.io.File.getContent(p); 
    } 
    catch(e:Dynamic) { 
     return haxe.macro.Context.error('Failed to load file $path: $e', Context.currentPos()); 
    } 
} 

static function toExpr(v:Dynamic) { 
    return Context.makeExpr(v, Context.currentPos()); 
} 
Смежные вопросы