Per il bene di inviare un risposta completa, e nel caso in cui altre persone si chiedono
Nel tuo primo esempio, hai detto al compilatore che "res" contiene due proprietà - uno chiamato "metodo" (che is a String) e uno chiamato "data" (che è Array). Ora il JSON che stai utilizzando non ha uno Array<Dynamic>
, ha solo un oggetto dinamico. Un array sarebbe simile a: "data":[0,1]
.
Quindi, supponendo che significava per la JSON di avere data
come un oggetto dinamico, ecco come si esegue un ciclo su di esso, utilizzando Reflect (come lei ha ricordato nei commenti):
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));
Nota qui don 'Devo specificare il tipo di "res", dal momento che stiamo usando Reflection lasciandolo solo perché la Dinamica andrà bene.
Ora, se il vostro JSON contiene in realtà un array, il codice potrebbe essere simile:
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);
Qui si utilizza la digitazione esplicita per dire al compilatore che res.data è un array (e questa volta è in realtà è), e può passarci sopra normalmente.
La ragione per cui non si è verificato un errore in fase di compilazione è perché il compilatore pensava che ci sarebbe stato davvero un array lì, come tu hai detto che c'era. In fase di esecuzione, anche se non viene generata un'eccezione, probabilmente dipende dal target ... ma probabilmente vuole rimanere fuori da quella comunque :)
demo di entrambi gli stili di codice: http://try.haxe.org/#772A2
Il problema risolto . 'per (n in Reflect.fields (dati))' –
Questo ti fornirà solo un elenco di nomi di campi. Dovrai anche fare Reflect.field (data, n); –
@IgorBloom: Immagino che tu abbia dimenticato questa domanda. Per cortesia, sarebbe bello accettare una risposta o commentare ciò che non va su di loro invece di lasciarli allo scoperto. Grazie. – dagnelies