这个映射 JSON 对象的函数得到了@:build
-ed。当只有一个 JSON 文件或所有文件共享相同的字段结构时,它可以正常工作。但是当对象的结构不同时,我会得到结构子类型错误("Object requires field xxx")。最重要的是,对象的顺序有时很重要。
我不明白为什么要进行类型检查;你会认为它们会是匿名的对象并被单独留下。任何人都可以看看我是否做错了什么;否则我会在 Github 上提出问题。
public static function build():Array<Field> {
var fields = Context.getBuildFields();
// Object requires field "deep"
var files = ['{"name": "Test1", "id": { "deep" : 5 }}','{"name": "Test0","id": {}}'];
// no error
// var files = ['{"name": "Test0","id": {}}','{"name": "Test1", "id": { "deep" : 5 }}'];
var a:Array<Expr> = [];
for (s in files) {
var o = Context.parseInlineString(s, Context.currentPos());
a.push({ expr : EBinop(OpArrow, macro $v{s}, o), pos : Context.currentPos() });
}
var newfield:Field = {
name : "files", doc : null, meta : [], access : [AStatic, APublic], pos : Context.currentPos(),
// map array decl: [x => y]
kind : FVar(macro : StringMap<Dynamic>, { expr : EArrayDecl(a), pos : Context.currentPos() } )
};
fields.push(newfield);
return fields;
}
我正在使用Haxe 3.2.0-rc2。