2013-03-20 18 views
24

Mam obiekt parsowany z JSON (haxe.Json.parse()) i potrzebuję go powtórzyć. ja już próbowałem rzucić ten obiekt do Array<Dynamic>:Jak mogę iterować obiekt Dynamic w 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') 

Nie ma Can't iterate dynamic wyjątek, po prostu nie działa (iteracji). I completley nie rozumiem, dlaczego w procedurze iteracji Haxe jest tak trudne.

+4

Problem rozwiązany . 'dla (n w Reflect.fields (dane))' –

+1

Otrzymasz tylko listę nazw pól. Będziesz także musiał wykonać Reflect.field (dane, n); –

+0

@IgorBloom: Chyba zapomniałeś o tym pytaniu. Z uprzejmości miło byłoby przyjąć odpowiedź lub skomentować, co jest nie tak, zamiast pozostawić je na otwartej przestrzeni. Dzięki. – dagnelies

Odpowiedz

32

Dla nadania pełnej odpowiedzi, aw przypadku innych osób zastanawia

W pierwszym przykładzie, mówiłeś, że kompilator „res” zawiera dwie właściwości - jeden o nazwie „metoda” (co is a String) i jeden o nazwie "data" (który jest Array). Teraz JSON, którego używasz, w rzeczywistości nie ma Array<Dynamic>, po prostu ma obiekt dynamiczny. Tablica powinna wyglądać następująco: "data":[0,1].

Więc zakładając, że przeznaczona dla JSON mieć data jako obiekt dynamiczny, tu jest jak pętla nad nim, stosując Reflect (jak wspomniano w komentarzach):

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)); 

Uwaga tu don "Trzeba określić rodzaj" res ", ponieważ używamy Reflection, pozostawiając go tak, jak Dynamic będzie w porządku.

Teraz, jeśli JSON rzeczywiście zawiera tablicę, kod może wyglądać następująco:

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); 

Tutaj używasz wyraźne pisanie poinformować kompilator, że res.data jest tablicą (i tym razem rzeczywiście jest) i może normalnie przechodzić przez pętlę.

Powodem, dla którego nie otrzymałeś błędu podczas kompilacji, jest to, że kompilator uważał, że rzeczywiście istnieje tam tablica, jak ci powiedziałeś. W czasie wykonywania, czy nie zgłasza wyjątek prawdopodobnie zależy na tarczy ... ale prawdopodobnie chcesz, aby trzymać się tego w każdym razie :)

demo obu stylów kodu: http://try.haxe.org/#772A2

+9

Jason, dlaczego jesteś taki fajny? : D Powinieneś napisać książkę dla Haxe! –

+0

@CreativeMagic Przygotuję ten komentarz;) –

+0

Wielkie dzięki, problem został rozwiązany! –

Powiązane problemy