Haxeで動的オブジェクトを反復処理するにはどうすればよいですか?質問する

Haxeで動的オブジェクトを反復処理するにはどうすればよいですか?質問する

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 で反復処理の手順がなぜそれほど難しいのか、まったく理解できません。

ベストアンサー1

完全な回答を投稿するため、そして他の人が疑問に思っている場合に備えて

最初の例では、コンパイラーに「res」に 2 つのプロパティ (「method」(文字列) と「data」(配列)) が含まれていることを伝えました。現在使用している JSON には実際には はなくArray<Dynamic>、動的オブジェクトのみが含まれています。配列は次のようになります"data":[0,1]

したがって、JSON をdataDynamic オブジェクトとして持つことを意図していると仮定すると、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」のタイプを指定する必要はありません。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

おすすめ記事