完全な回答を投稿するため、および他の人が疑問に思っている場合に備えて
最初の例では、「res」には2つのプロパティが含まれていることをコンパイラに伝えました。1つは「method」(文字列)と呼ばれ、もう1つは「data」(配列)と呼ばれます。現在、使用しているJSONには実際にはがなくArray<Dynamic>
、動的オブジェクトが含まれているだけです。配列は次のようになります"data":[0,1]
。
したがって、JSONをdata
動的オブジェクトとして持つことを意図していると仮定すると、Reflectを使用して(コメントで述べたように)、JSONをループする方法は次のとおりです。
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」のタイプを指定する必要がないことに注意してください。これは、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);
ここでは、明示的な型指定を使用して、res.dataが配列であり(今回は実際には配列である)、通常どおりループできることをコンパイラーに通知します。
コンパイル時にエラーが発生しなかった理由は、コンパイラが、実際に配列が存在すると言ったように、そこに配列が存在すると考えていたためです。実行時に、例外をスローするかどうかはおそらくターゲットに依存します...しかし、とにかくそれを避けたいと思うでしょう:)
両方のスタイルのコードのデモ:http://try.haxe.org/#772A2