2013-03-20 13 views
24

iterieren Ich habe Objekt aus JSON (haxe.Json.parse()) geparst und ich muss darüber iterieren. Ich habe bereits versucht, diese Aufgabe zu Array<Dynamic> würfenWie kann ich dynamisches Objekt 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') 

Es gibt keine Can't iterate dynamic Ausnahme, einfach nicht funktioniert (iteriert). Ich verstehe nicht, warum in Haxe Iterating-Verfahren so schwierig ist.

+4

Das Problem ist gelöst . 'für (n in Reflect.fields (Daten))' –

+1

Dies wird nur erhalten Sie eine Liste von Feldnamen. Sie müssen auch Reflect.field (Daten, n); –

+0

@IgorBloom: Ich denke, du hast diese Frage vergessen. Aus Höflichkeit wäre es schön, entweder eine Antwort zu akzeptieren oder zu kommentieren, was an ihnen nicht stimmt, anstatt sie offen zu lassen. Vielen Dank. – dagnelies

Antwort

32

Aus Gründen eine vollständige Antwort der Entsendung und für den Fall, fragen andere Menschen

In Ihrem ersten Beispiel haben Sie den Compiler gesagt, dass „res“ zwei Eigenschaften enthält - eine „Methode“ genannt (die ist ein String) und einer namens "data" (was Array ist). Jetzt hat der JSON, den du verwendest, keinen Array<Dynamic>, er hat nur ein dynamisches Objekt. Ein Array würde wie folgt aussehen: "data":[0,1].

Also, vorausgesetzt, Sie bedeutete für die JSON data als dynamisches Objekt zu haben, ist hier, wie Sie eine Schleife über sie, Reflektieren verwenden (wie Sie in den Kommentaren erwähnt):

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

Hinweis hier wir don Ich muss den Typ von "res" nicht angeben, da wir Reflection nur als Dynamic verwenden.

Nun, wenn Ihr JSON tatsächlich ein Array enthält, könnte der Code wie folgt aussehen:

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

Hier können Sie explizite Typisierung dem Compiler mitzuteilen, dass ein Array res.data ist (und diesmal ist es wirklich ist), und es kann normalerweise über es Schleife.

Der Grund, warum Sie bei der Kompilierung keinen Fehler bekommen haben, ist, dass der Compiler gedacht hat, dass es dort wirklich ein Array geben wird, wie Sie ihm gesagt haben. Zur Laufzeit, ob es eine Ausnahme auslöst, hängt wahrscheinlich auf dem Ziel ... aber Sie wollen wahrscheinlich aus, dass auf jeden Fall bleiben :)

Demo beiden Arten von Code: http://try.haxe.org/#772A2

+9

Jason, warum bist du so cool? : D Du solltest ein Buch für Haxe schreiben! –

+0

@CreativeMagic Ich werde diesen Kommentar auffrischen;) –

+0

Vielen Dank, Problem wurde gelöst! –

Verwandte Themen