2016-11-04 58 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,你'd可能想使用-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()); 
}