Json 如何在Haxe中迭代动态对象

Json 如何在Haxe中迭代动态对象,json,dynamic,loops,haxe,Json,Dynamic,Loops,Haxe,我已经从JSON(haxe.JSON.parse())解析了对象,需要对其进行迭代。 我已尝试将此对象强制转换为数组: var-data:String='{“data”:{“0”:0,“1”:1},“method”:“test”}; var res:{method:String,data:Array}=haxe.Json.parse(数据); 对于(n个分辨率数据) 跟踪('aa') 没有无法迭代动态异常,只是无法工作(迭代)。 我完全不明白为什么在Haxe中迭代过程如此困难。为了发布完整的答

我已经从JSON(
haxe.JSON.parse()
)解析了对象,需要对其进行迭代。 我已尝试将此对象强制转换为
数组

var-data:String='{“data”:{“0”:0,“1”:1},“method”:“test”};
var res:{method:String,data:Array}=haxe.Json.parse(数据);
对于(n个分辨率数据)
跟踪('aa')
没有
无法迭代动态
异常,只是无法工作(迭代)。

我完全不明白为什么在Haxe中迭代过程如此困难。

为了发布完整的答案,以防其他人感到疑惑

在第一个示例中,您告诉编译器“res”包含两个属性——一个称为“method”(是字符串),另一个称为“data”(是数组)。现在,您使用的JSON实际上没有
数组
,它只有一个动态对象。数组看起来像:
“数据”:[0,1]

因此,假设您希望JSON将
数据
作为一个动态对象,下面是您如何使用Reflect(如您在注释中提到的)在其上循环的:

请注意,这里我们不必指定“res”的类型,因为我们使用反射,只需将其保留为动态即可

现在,如果您的JSON实际上包含一个数组,那么代码可能如下所示:

var data:String='{"data":[0,1],"method":"test"}';
var res:{method:String,data:Array<Int>} = haxe.Json.parse(data);
for (n in res.data)
    trace(n);
var数据:String='{“data”:[0,1],“method”:“test”}';
var res:{method:String,data:Array}=haxe.Json.parse(数据);
对于(n个分辨率数据)
微量元素(n);
在这里,您使用显式类型告诉编译器res.data是一个数组(这次它实际上是一个数组),并且它可以正常循环

编译时没有出现错误的原因是,编译器认为那里真的会有一个数组,正如您所说的那样。在运行时,它是否抛出异常可能取决于目标。。。但你可能无论如何都不想插手:)


两种代码样式的演示:

问题已解决
for(在Reflect.fields(data)中为n))
这只会得到字段名列表。您还需要执行Reflect.field(数据,n)@我猜你忘了这个问题。出于礼貌,最好是接受一个答案,或者评论他们的错误,而不是把他们公开。谢谢,对不起。Im开始使用Reflects,它在各个方面都对我有帮助。为什么你这么酷你应该为哈克斯写一本书!在Haxe 3.1.3(当前版本)中,数组迭代会产生以下编译错误:
Test.hx:19:characters 11-19:您不能对动态值进行迭代,请指定迭代器或Iterable
@anissen我已经更新了try.Haxe.org链接,以便在这里使用答案中的代码,它可以工作。如果你想进行迭代,类型注释(
res:{method:String,data:Array}
)是必要的。是的,这本书是Jason和@back2dos共同努力的成果,它会很棒!
var data:String='{"data":{"0":0,"1":1},"method":"test"}';
var res = haxe.Json.parse(data);
for (n in Reflect.fields(res.data))
    trace(Reflect.field(res.data, n));
var data:String='{"data":[0,1],"method":"test"}';
var res:{method:String,data:Array<Int>} = haxe.Json.parse(data);
for (n in res.data)
    trace(n);