2013-03-20 18 views
24

Ho Object analizzato da JSON (haxe.Json.parse()) e ho bisogno di scorrere su di esso. Ho già provato a lanciare questo oggetto per Array<Dynamic>:Come posso iterare oggetto dinamico in 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') 

Non c'è Can't iterate dynamic eccezione, semplicemente non funziona (iterazione). Completamente non capisco perché nella procedura di iterazione di Haxe sia così difficile.

+4

Il problema risolto . 'per (n in Reflect.fields (dati))' –

+1

Questo ti fornirà solo un elenco di nomi di campi. Dovrai anche fare Reflect.field (data, n); –

+0

@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

risposta

32

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

+9

Jason, perché sei così forte? : D Dovresti scrivere un libro per Haxe! –

+0

@CreativeMagic Inoltrerò quel commento;) –

+0

Grazie mille, il problema è stato risolto! –