在AS3我可以按如下方式嵌入一个JSON文件:嵌入JSON文件
[Embed(source = "controllers.json", mimeType='application/octet-stream')]
private static const JSON_CONTROLLERS:Class;
有同等方式HAXE做到这一点?
如果不是,我的选择是什么?
在AS3我可以按如下方式嵌入一个JSON文件:嵌入JSON文件
[Embed(source = "controllers.json", mimeType='application/octet-stream')]
private static const JSON_CONTROLLERS:Class;
有同等方式HAXE做到这一点?
如果不是,我的选择是什么?
如果您使用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的使用示例。
除了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());
}