Подтвердить что ты не робот

Как я могу выполнить итерацию динамического объекта в Haxe

У меня есть объект, обработанный JSON (haxe.Json.parse()), и мне нужно перебрать его. Я уже пробовал применить этот объект к 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')

Нет исключения Can't iterate dynamic, просто не работает (итерация). Я не понимаю, почему в процедуре итерации Haxe так сложно.

4b9b3361

Ответ 1

Чтобы отправить полный ответ, и в случае, если другие люди задаются вопросом

В первом примере вы сказали компилятору, что "res" содержит два свойства: один называется "метод" (который является строкой) и один называется "data" (это Array). Теперь JSON, который вы используете, на самом деле не имеет Array<Dynamic>, он просто имеет динамический объект. Массив будет выглядеть так: "data":[0,1].

Итак, предполагая, что вы хотели, чтобы JSON имел data в качестве динамического объекта, вот как вы его перебираете, используя Reflect (как вы упомянули в комментариях):

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

Обратите внимание, что нам не нужно указывать тип "res", так как мы используем Reflection, просто оставляя его как Dynamic, будет нормально.

Теперь, если ваш JSON действительно содержит массив, код может выглядеть так:

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

Здесь вы используете явную типизацию, чтобы сообщить компилятору, что res.data является массивом (и на этот раз это на самом деле), и он может нормально перебирать его.

Причина, по которой вы не получили ошибку во время компиляции, состоит в том, что компилятор думал, что там действительно будет массив, как вы сказали, что это было. Во время выполнения, независимо от того, выбрасывает ли оно исключение, вероятно, зависит от цели... но вы, вероятно, хотите остаться в стороне от этого:)

Демонстрация обоих стилей кода: http://try.haxe.org/#772A2