27

我从 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 中迭代过程如此困难。

4

1 回答 1

38

为了发布完整的答案,以防其他人想知道

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

因此,假设您打算将 JSONdata作为 Dynamic 对象,以下是使用 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));

请注意,这里我们不必指定“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);

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

您在编译时没有收到错误的原因是因为编译器认为那里真的会有一个数组,正如您所说的那样。在运行时,它是否抛出异常可能取决于目标......但你可能还是想远离那个:)

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

于 2013-03-21T08:54:49.410 回答