2016-11-04 60 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()); 
}