2014-06-06 19 views
14

Tôi đang sử dụng NSJSONSerialization để phân tích JSON trong ứng dụng Swift. Tuy nhiên, từ điển được trả về bao gồm cấu trúc lồng nhau phức tạp, sâu sắc, khiến việc khai báo kiểu rất dài không thực tế (ví dụ: Dictionary<String, Array<Dictionary<String, ....>>).Làm cách nào để thao tác các từ điển lồng nhau trong Swift, ví dụ: Dữ liệu JSON?

Có cách nào tốt để làm việc với cấu trúc như vậy trong Swift, nơi mà cấu trúc của bộ sưu tập rất phức tạp và các kiểu của nó không được biết cho đến khi chạy?

Trả lời

12

Chỉ cần lấy một tham chiếu đến dữ liệu json bạn như là một NSDictionary:

var dict: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 

sau đó bạn có thể tham khảo nó bằng cách sử subscript:

var myValue: NSString = dict["level1"]["level2"] 
+1

Cảm ơn! Sử dụng NSDictionary trực tiếp giúp. Tuy nhiên, tôi không nghĩ rằng nó thực hiện subscripting: Tôi đã phải gọi 'objectForKey'. – Bill

+1

Tôi đang gặp phải điều tương tự. Tôi cần phải gọi objectForKey trên các mục bên trong để có được quyền truy cập vào chúng. Không làm điều này dường như không chỉ gây ra một vấn đề, nhưng tai nạn Xcode 6 thậm chí ... – tibbon

+0

Điều này không làm việc cho tôi. Tôi có 'var dict: NSDictionary = NSDictionary (contentOfFile:" some/path "); var deepValue = conjugationTable ["level1"] ["level2"] ["level3"] ' Và trình biên dịch phàn nàn rằng nó 'Không thể tìm thấy quá tải cho' subscript 'chấp nhận các đối số được cung cấp.' – NRitH

5

myDictionary["accounts"] có thể là một tùy chọn. Hãy thử: myDictionary["accounts"]?["active"]?

4

Trong obj-C chúng ta có thể viết,

cityName = myDictionary[@"photos"][@"region"][@"city"]

Như nhiều ở đây đã phát hiện ra, ở trên không áp dụng trong Swift, ít nhất nó không bao giờ có đối với tôi.

Đây là cách bạn làm điều này trong Swift để truy cập vào ba chỉ số trong một NSDictionary cho một String,

let cityName = ((myDictionary!["photos"] as NSDictionary)["region"]! as NSDictionary)["city"]! as String`

Tôi hy vọng rằng trong bản cập nhật tiếp theo để Swift tất cả điều đó có thể được giảm xuống còn những gì chúng tôi đã có trong Obj-C.

+0

Sẽ dễ dàng hơn nhiều nếu nó được truyền vào 'NSDictionary' và sử dụng' valueForKeyPath' như '(jsonResponse như NSDictionary) .valueForKeyPath (" geometry.location.lat ") là? Int'. Nhưng cũng đã đi qua một cách khác để có được dữ liệu lồng nhau trong từ điển. +1 – GoodSp33d

+0

Tôi đã chạy vào cùng một probelem. Điều này đã được thực hiện dễ dàng hơn? Tôi đang tìm kiếm một cách tự động để phân tích cú pháp hoàn toàn và nhập một toàn bộ từ điển lồng nhau/mảng mix json. –

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