2014-06-06 15 views
14

Bir Swift uygulamasında JSON'yi ayrıştırmak için NSJSONSerialization kullanıyorum. Bununla birlikte, döndürülen sözlük karmaşık, derin iç içe geçmiş bir yapıdan oluşur ve bu da çok uzun tip bildirimlere sahip olmamayı (örneğin, Dictionary<String, Array<Dictionary<String, ....>>) sağlar.İç içe geçmiş sözlükleri Swift'de, örn. JSON verileri?

Koleksiyonun yapısının çok karmaşık olduğu ve çalışma zamanına kadar türlerinin bilinmediği Swift'de böyle bir yapıyla çalışmak için iyi bir yol var mı?

cevap

12

Sadece bir NSDictionary olarak json veri referansı kapmak:

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

o zaman alt simgeler kullanarak başvurabilirsiniz:

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

Teşekkürler! NSDictionary kullanarak doğrudan yardımcı olur. Ancak, aboneliği uygulayacağını sanmıyorum: 'objectForKey' çağırmak zorunda kaldım. – Bill

+1

Aynı durumla karşılaşıyorum. Onlara erişmek için iç öğeler üzerinde objectForKey aramam gerekiyor. Bunu yapmamak sadece bir sorun değil, Xcode 6'yı da çökertti ... – tibbon

+0

Bu benim için işe yaramıyor. 'var dict: NSDictionary = NSDictionary (contentOfFile:" some/path "); var deepValue = konjugationTable ["level1"] ["level2"] ["level3"] ' Ve derleyici, 'Sağlanan argümanları kabul eden' subscript 'için aşırı yük bulamadığından şikayet ediyor.' – NRitH

5

myDictionary["accounts"] isteğe bağlı olabilir. Deneyin: myDictionary["accounts"]?["active"]? Obj-C

4

yazabiliriz,

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

burada keşfettim gibi birçok yukarıda Swift geçerli değildir, en azından benim için vardır asla. İşte

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

Ben Swift yanında güncellemesinde bütün bunlar ne olduk indirgenebilir umut, bir dize için bir NSDictionary üç endeks erişmek için size Swift bunu nasıl Obj-C.

+0

Eğer 'NSDictionary' için oyuncu kademesi ve 'valueForKeyPath' gibi ('NSDictionary olarak jsonResponse') .valueForKeyPath ("geometry.location.lat") olarak kullanımı çok daha kolay olurdu? Int'. Ancak, sözlük dışında iç içe geçmiş veriler elde etmek için başka bir yolla karşılaştık. +1 – GoodSp33d

+0

Aynı probelem içine girdim. Bu daha kolay oldu mu? Tüm iç içe geçmiş bir sözlük/dizi karışımı json tamamen ayrıştırmak ve typecast için otomatik bir yol arıyorum. –

İlgili konular