json dynamic loops haxe

json - ¿Cómo puedo iterar un objeto dinámico en Haxe?



dynamic loops (1)

Tengo Object analizado desde JSON ( haxe.Json.parse() ) y necesito iterar sobre él. Ya intenté lanzar este objeto a Array<Dynamic> :

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

No existe Can''t iterate dynamic excepción Can''t iterate dynamic , simplemente no funciona (iterando). Completamente no entiendo por qué en Haxe el procedimiento de iteración es tan difícil.


Por el bien de publicar una respuesta completa, y en caso de que otras personas se pregunten

En su primer ejemplo, le dijo al compilador que "res" contiene dos propiedades: una llamada "método" (que es una Cadena) y otra llamada "datos" (que es Array). Ahora el JSON que está utilizando no tiene un Array<Dynamic> , solo tiene un objeto dinámico. Una matriz se vería como: "data":[0,1] .

Entonces, suponiendo que quisieras que el JSON tuviera data como un objeto dinámico, aquí es cómo lo recorre, usando Reflect (como mencionaste en los comentarios):

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

Tenga en cuenta que no es necesario que especifiquemos el tipo de "res", ya que estamos utilizando Reflection simplemente dejándolo como Dynamic estará bien.

Ahora, si su JSON en realidad contiene una matriz, el código podría verse así:

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

Aquí usa el tipado explícito para decirle al compilador que res.data es una matriz (y esta vez sí), y puede recorrerlo normalmente.

La razón por la que no obtuvo un error en tiempo de compilación es porque el compilador pensó que realmente iba a haber una matriz allí, como usted dijo. En tiempo de ejecución, si arroja una excepción o no, probablemente dependa del objetivo ... pero es probable que prefieras evitarlo :)

Demostración de ambos estilos de código: http://try.haxe.org/#772A2