2015-09-07 21 views
6
webservice (API) dan JSON çözerken

i almak hatası:Swift JSON hatası: hiç türü '__NSDictionaryM' değerini döküm olamazdı 'NSArray'

Could not cast value of type '__NSDictionaryM' (0x1037ad8a8) to 'NSArray' (0x1037ad470). 

Benim Kod:

var kGetURL = "http://bitnami.local/cscart_demo/api/users" 

//var kGetURL = "http://localhost/fendy/getjson.php" 

var json : Array<AnyObject> = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    start() 
} 

func getData(data : NSData){ 
    //error at this line : 
    json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! Array<AnyObject> 
    //error 
    tableView.reloadData() 
} 

func start(){ 
    var url : NSURL = NSURL(string: kGetURL)! 
    var data : NSData = NSData(contentsOfURL: url)! 
    getData(data) 
} 

eğer url'yi http://localhost/fendy/getjson.php olarak değiştiriyorum, çok güzel çalışıyor. Benim url webcoder http://localhost/fendy/getjson.php den http://bitnami.local/cscart_demo/api/users

Tepki ise

i hatayı alıyorum:

[{"id":"17","Name":"KFC","Message":"awesome"}, 
{"id":"18","Name":"McDonald","Message":"good"}, 
{"id":"23","Name":"Burger King","Message":"tasty"}, 
{"id":"38","Name":"Pizza hut","Message":"yummy"}, 
{"id":"39","Name":"Steak","Message":"very Delicious"}] 

webservice http://bitnami.local/cscart_demo/api/users yanıtı:

{"users": 
[{"user_id":"4","user_login":"user_4","is_root":"N","timestamp":"1441608048","user_type":"C","status":"A","firstname":"","lastname":"","email":"[email protected]","company":"","company_id":"1","company_name":"Simtech"}, 
{"user_id":"3","user_login":"customer","is_root":"N","timestamp":"1441604240","user_type":"C","status":"A","firstname":"Customer","lastname":"Customer","email":"[email protected]","company":"Simtech","company_id":"1","company_name":"Simtech"}, 
{"user_id":"1","user_login":"admin","is_root":"Y","timestamp":"1441604240","user_type":"A","status":"A","firstname":"John","lastname":"Doe","email":"[email protected]","company":"Your company","company_id":"0","company_name":null}], 
"params":{"page":1,"items_per_page":"10","sort_order":"asc","sort_by":"name","sort_order_rev":"desc","total_items":"3"}} 

ben Stil aynıdır düşünüyorum, ama neden olmasın url http://bitnami.local/cscart_demo/api/users ile çalışma. herkes yardımcı olabilir?

cevap

4

Bitnami yanıtı { ile başlar ve bu nedenle NSDictionary'a karşılık gelen JSON object şeklindedir. Diğeri ise bir diziyi gösteren [ ile başlar. aşağıdaki gibi

Sen Dictionary<String, AnyObject> için json türünü değiştirmek ve serisini gerekir:

json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! Dictionary<String, AnyObject> 
+0

? Mümkün? tableView içinde CellforRowIndexPath ben değiştiririm: var info: AnyObject? = json [indexpath.row]? – fendy

0

Yöntemin bir diziye JSON sonucu döküm edilir. JSON olarak temsil edilen bir diziyi döndüren URL ile iyi çalışır, ancak JSON olarak temsil edilen bir diziyi değil, bir sözlük döndüren URL ile çalışmaz.

İade edilen değerlerin "stili" aynı görünüyor olsa da, ikincisi tek öğeli bir sözlüktür. Muhtemelen istediğin, bir dizi olan "users" elemanını çıkarmaktır.

sen as! yerine dökme as? ile hem stilleri deneyebilirsiniz Eğer alıyorsanız iki URL'den hangi bilmiyorsanız i json tipi veri NSDictionary kullanarak eğer

let tmp : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) 
if let arr = tmp as? Array<AnyObject> { 
    json = arr 
} else if dict = tmp as? [String: AnyObject] { 
    json = dict["users"] as! Array<AnyObject> 
} else { 
    // Handle an error: the input was unexpected 
} 
tableView.reloadData() 
+0

öylesine, yazın Veri değişkeni json NSDictionary? hatayı aldığımda hata alıyorum: izin veriyor mu? Array {// Bir koşulda değişken bağlama bir başlatıcı gerektirir – fendy

+0

@fendy Haklısınız, ödevi yapmayı unutmuşum. Şimdi dene. – dasblinkenlight