在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());
}