在项目中嵌入Json文件

时间:2016-11-04 18:49:07

标签: haxe

在AS3中,我可以按如下方式嵌入Json文件:

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

在Haxe中是否有相同的方法可以做到这一点?

如果没有,我的选择是什么?

2 个答案:

答案 0 :(得分: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,但仅限于swf目标。 OpenFL使这项工作适用于所有目标。

  • 使用openfl.Assets

    project.xml / application.xml文件中加入资源文件夹:

    <assets path="assets" />
    

    访问文件内容:

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

使用纯Haxe,您可能希望使用-resource - 请查看Haxe Manual以获取使用示例。

答案 1 :(得分: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());
}