2015-09-07 9 views
6

quando decodifica JSON da webservice (API) ottengo l'errore:errore Swift JSON: Impossibile lanciare valore di tipo '__NSDictionaryM' a 'NSArray'

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

My Code:

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

se cambio l'url a http://localhost/fendy/getjson.php, funziona così bene.

ottengo l'errore se il mio url è http://bitnami.local/cscart_demo/api/users

Risposta da webservice http://localhost/fendy/getjson.php:

[{"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"}] 

Risposta da webservice http://bitnami.local/cscart_demo/api/users:

{"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"}} 

penso che sia di stile è lo stesso, ma perché non lavora con l'url http://bitnami.local/cscart_demo/api/users. qualcuno può aiutare?

risposta

4

La risposta bitnami inizia con un { ed è quindi un JSON object, che corrisponde a NSDictionary. L'altro inizia con [ che indica un array.

è necessario cambiare il tipo di json a Dictionary<String, AnyObject>, e deserializzare come segue:

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

se si utilizza il tipo di dati JSON NSDictionary? è possibile? in tableView CellforRowIndexPath ho modificato: var info: AnyObject? = json [indexpath.row]? – fendy

0

Il tuo metodo è colata risultato JSON a un array. Funziona perfettamente con l'URL che restituisce un array rappresentato come JSON, ma non funziona con l'URL che restituisce un dizionario, non un array, rappresentato come JSON.

Sebbene lo "stile" dei valori restituiti sia lo stesso, il secondo è un dizionario di un articolo. Quello che probabilmente vuoi è estrarre l'elemento "users" da esso, che è una matrice.

Se non si sa quale dei due URL si stanno ottenendo, si potrebbe provare entrambi gli stili con as? espressi invece di as!:

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

quindi, digitare Data variabile json deve NSDictionary? ricevo un errore mentre seguo il tuo esempio: se l'arr? Array {// il binding con una variabile richiede un inizializzatore – fendy

+0

@fendy Hai ragione, ho dimenticato di eseguire il compito. Provalo ora. – dasblinkenlight

Problemi correlati