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」には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

于 2013-03-21T08:54:49.410 に答える