在AS3中,我可以按如下方式嵌入Json文件:
[Embed(source = "controllers.json", mimeType='application/octet-stream')]
private static const JSON_CONTROLLERS:Class;
在Haxe中是否有相同的方法可以做到这一点?
如果没有,我的选择是什么?
答案 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());
}