我从JSON(haxe.Json.parse()
)解析了对象,我需要迭代它。
我已经尝试将此对象强制转换为Array<Dynamic>
:
var data:String='{"data":{"0":0,"1":1},"method":"test"}';
var res:{method:String,data:Array<Dynamic>} = haxe.Json.parse(data);
for (n in res.data)
trace('aa')
没有Can't iterate dynamic
异常,只是没有工作(迭代)。
我完全不理解为什么在Haxe中迭代过程如此困难。
答案 0 :(得分:36)
为了发布完整的答案,以防其他人想知道
在您的第一个示例中,您已告诉编译器&#34; res&#34;包含两个属性 - 一个叫做&#34;方法&#34; (这是一个字符串)和一个名为&#34;数据&#34; (这是数组)。现在你使用的JSON实际上没有Array<Dynamic>
,它只有一个动态对象。数组看起来像是:"data":[0,1]
。
因此,假设您的JSON要将data
作为动态对象,请使用Reflect(如您在评论中提到的那样)循环使用它:
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));
请注意,我们不必指定&#34; res&#34;的类型,因为我们正在使用Reflection,因为动态会很好。
现在,如果您的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);
在这里,您使用显式类型来告诉编译器res.data是一个数组(这次它实际上是),它可以正常循环它。
你在编译时没有得到错误的原因是因为编译器认为那里确实存在一个数组,正如你所说的那样。在运行时,它是否会抛出异常可能取决于目标......但是你可能还是想要远离它:)
演示两种代码形式:http://try.haxe.org/#772A2