2013-03-20 21 views
24

私はJSON(haxe.Json.parse())からオブジェクトを解析しており、それを反復処理する必要があります。 私はすでにArray<Dynamic>にこのオブジェクトをキャストしようとした:ちょうど(反復)機能していない、Haxeの動的オブジェクトを反復処理するには

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例外ではありません。 私はcompletlyなぜHaxe iterating手順では難しいか理解していない。

+4

解決される問題。 'for(Reflect.fields(data)のn)' –

+1

これはあなたにフィールド名のリストを与えるだけです。また、Reflect.field(data、n)を実行する必要があります。 –

+0

@IgorBloom:あなたはこの質問を忘れてしまったと思います。礼儀のために、答えを受け入れるか、何が間違っているかをコメントに残すのではなく、返事を残しておくのが良いでしょう。ありがとう。 – dagnelies

答えて

32

完全な答えを掲示し、場合に他の人があなたの最初の例では

を不思議に思っているのために、あなたは「解像度」は、2つのプロパティが含まれていることをコンパイラに指示しました - 1と呼ばれる「メソッド」(これははString)、もう1つは "data"(配列)です。今使用しているJSONには実際にはArray<Dynamic>がありません。動的オブジェクトを持っています。配列は、"data":[0,1]のようになります。

だから、あなたはダイナミックオブジェクトとしてdataを持っている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のタイプを指定する必要はありません。今

、あなたのJSONが実際に配列が含まれている場合、コードは次のようになります。

あなたが実際にres.dataが配列でコンパイラ(そして今回、それを伝えるために、明示的なタイピングを使用ここで
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); 

をis)、それは通常それをループすることができます。

コンパイル時にエラーが発生しなかったのは、コンパイラが本当にそこに配列されていると思ったからです。コードの両方のスタイルの実行時には、それが例外をスローするか否か、おそらくターゲットに依存します...しかし、あなたはおそらく、とにかくその外に滞在したい:)

デモ:http://try.haxe.org/#772A2

+9

Jason、なぜあなたはとても涼しいですか? :DあなたはHaxeの本を書くべきです! –

+0

@CreativeMagic私はそのコメントをupvoteよ); –

+0

ありがとう、問題は解決しました! –

関連する問題