2013-03-20 24 views
24

Tôi có đối tượng được phân tích cú pháp từ JSON (haxe.Json.parse()) và tôi cần lặp lại nó. Tôi đã cố gắng để cast đối tượng này để Array<Dynamic>:Làm cách nào để tôi có thể lặp lại đối tượng Động trong 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') 

Không có Can't iterate dynamic ngoại lệ, chỉ cần không làm việc (lặp lại). Tôi hoàn thành không hiểu tại sao thủ tục lặp lại Haxe lại quá khó.

+4

Vấn đề giải quyết . 'for (n trong Reflect.fields (dữ liệu))' –

+1

Điều này sẽ chỉ cho bạn một danh sách các tên trường. Bạn cũng sẽ cần phải làm Reflect.field (dữ liệu, n); –

+0

@IgorBloom: Tôi đoán bạn đã quên câu hỏi này. Trong lịch sự, nó sẽ được tốt đẹp để chấp nhận một câu trả lời hoặc nhận xét những gì sai về họ thay vì để chúng trong mở. Cảm ơn. – dagnelies

Trả lời

32

Vì lợi ích của đăng một câu trả lời hoàn chỉnh, và trong trường hợp người khác đang tự hỏi

Trong ví dụ đầu tiên của bạn, bạn đã nói với trình biên dịch rằng "res" chứa hai thuộc tính - một gọi là "phương pháp" (mà là một String) và được gọi là "data" (là Array). Bây giờ JSON bạn đang sử dụng không thực sự có một Array<Dynamic>, nó chỉ có một đối tượng động. Một mảng sẽ trông giống như: "data":[0,1].

Vì vậy, giả sử bạn có nghĩa là cho các JSON để có data như một đối tượng động, ở đây là làm thế nào bạn vòng qua nó, sử dụng Reflect (như bạn đề cập trong các ý kiến):

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

Lưu ý ở đây chúng tôi don không phải chỉ định loại "res", vì chúng tôi đang sử dụng Reflection chỉ để lại nó như Dynamic sẽ được sử dụng tốt.

Bây giờ, nếu JSON của bạn thực sự có chứa một mảng, các mã có thể trông như thế này:

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

Ở đây bạn sử dụng gõ rõ ràng để nói với trình biên dịch rằng res.data là một Array (và lần này nó thực sự là) và nó có thể lặp lại thông thường.

Lý do bạn không gặp phải lỗi khi biên dịch là vì trình biên dịch nghĩ rằng thực sự có một mảng ở đó, như bạn đã nói. Khi chạy, có hay không nó ném một ngoại lệ có thể phụ thuộc vào mục tiêu ... nhưng có thể bạn muốn ở lại ra khỏi đó anyway :)

Demo của cả hai phong cách mã: http://try.haxe.org/#772A2

+9

Jason, tại sao bạn lại rất tuyệt? : D Bạn nên viết một cuốn sách cho Haxe! –

+0

@CreativeMagic Tôi sẽ upvote rằng bình luận;) –

+0

Cảm ơn rất nhiều, vấn đề đã được giải quyết! –

Các vấn đề liên quan