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
Problem rozwiązany . 'dla (n w Reflect.fields (dane))' –
Otrzymasz tylko listę nazw pól. Będziesz także musiał wykonać Reflect.field (dane, n); –
@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