【问题标题】:How can I iterate Dynamic object in Haxe如何在 Haxe 中迭代动态对象
【发布时间】:2013-03-09 23:11:37
【问题描述】:

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

【问题讨论】:

  • 问题解决了。 for (n in Reflect.fields(data))
  • 这只会为您提供字段名称列表。你还需要做 Reflect.field(data, n);
  • @IgorBloom:我猜你忘记了这个问题。出于礼貌,最好接受答案或评论他们的问题,而不是让他们公开。谢谢。
  • 对不起。我开始使用 Reflects,它在各个方面都对我有帮助

标签: json dynamic loops haxe


【解决方案1】:

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

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

因此,假设您打算让 JSON 将 data 作为动态对象,以下是您如何使用 Reflect 循环遍历它(正如您在 cmets 中提到的那样):

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

【讨论】:

  • 杰森,你怎么这么酷? :D 你应该为 Haxe 写一本书!
  • 在 Haxe 3.1.3(当前版本)中,数组迭代给出以下编译错误:Test.hx:19: characters 11-19 : You can't iterate on a Dynamic value, please specify Iterator or Iterable
  • @anissen 我已经更新了 try.haxe.org 链接以在此处使用答案中的代码,并且可以正常工作。如果要迭代,类型注释 (res:{method:String,data:Array&lt;Int&gt;}) 是必需的。
  • 是的,这本书是 Jason 和 @back2dos 共同努力的结果,太棒了!
猜你喜欢
  • 2010-09-08
  • 2016-08-11
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多