如何在Haxe中迭代Dynamic对象

Igo*_*oom 26 json loops haxe dynamic

我有从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')
Run Code Online (Sandbox Code Playgroud)

没有Can't iterate dynamic例外,只是没有工作(迭代).我完全不理解为什么在Haxe迭代过程中如此困难.

Jas*_*eil 37

为了发布一个完整的答案,以防万一其他人在想

在你的第一个例子中,你告诉编译器"res"包含两个属性 - 一个叫做"method"(一个是String),一个叫做"data"(就是Array).现在你正在使用的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));
Run Code Online (Sandbox Code Playgroud)

请注意,我们不必指定"res"的类型,因为我们使用Reflection只是将它保留为Dynamic会很好.

现在,如果您的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);
Run Code Online (Sandbox Code Playgroud)

在这里,您使用显式类型来告诉编译器res.data是一个数组(这次它实际上是),它可以正常循环它.

您在编译时没有收到错误的原因是因为编译器认为那里确实存在一个数组,正如您所说的那样.在运行时,它是否抛出异常可能取决于目标...但你可能想要不管怎么样:)

两种代码风格的演示:http://try.haxe.org/#772A2

  • 杰森,你为什么这么酷?:D你应该为Haxe写一本书! (9认同)