2015-09-07 11 views
6

wenn JSON Decodierung von Webservice (API) i erhalten Fehler:Swift JSON Fehler: Konnte nicht Wert vom Typ '__NSDictionaryM' gegossen 'NSArray'

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

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

wenn Ich ändere URL zu http://localhost/fendy/getjson.php, sein Arbeiten so nett.

bekomme ich Fehler, wenn meine URL http://bitnami.local/cscart_demo/api/users

Antwort von WebService ist 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"}] 

Antwort von 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"}} 

Ich denke, es ist Stil gleiche ist, aber warum nicht Arbeiten mit URL http://bitnami.local/cscart_demo/api/users. kann jemand helfen?

Antwort

4

Die Bitnami-Antwort beginnt mit einem { und ist daher ein JSON object, was einem NSDictionary entspricht. Der andere beginnt mit [, was auf ein Array hinweist.

Sie müssen die Art der json zu Dictionary<String, AnyObject> ändern, und deserialisieren wie folgt:

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

wenn i json Typ Daten NSDictionary mit? es ist möglich? In TableView CellforRowIndexPath ändere ich: var info: AnyObject? = json [indexpfad.row]? – fendy

0

Ihre Methode wirft JSON Ergebnis in ein Array. Es funktioniert gut mit der URL, die ein als JSON dargestelltes Array zurückgibt, aber es funktioniert nicht mit der URL, die ein Wörterbuch zurückgibt, kein Array, das als JSON dargestellt wird.

Obwohl der "Stil" der zurückgegebenen Werte gleich aussieht, ist der zweite ein Wörterbuch mit einem Eintrag. Was Sie wahrscheinlich wollen, ist das "users" Element daraus zu extrahieren, das ein Array ist.

Wenn Sie nicht, welche der beiden URLs wissen Sie immer, Sie beide Stile mit as? statt as! werfen versuchen könnte:

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

also, geben Sie Daten Variable JSON muss NSDictionary? Ich bekomme Fehler, wenn Sie Ihrem Beispiel folgen: wenn arr? Array {// Variable Bindung in einem Zustand erfordert einen Initialisierer – fendy

+0

@fendy Sie haben Recht, ich habe vergessen, die Aufgabe zu tun. Probieren Sie es jetzt. – dasblinkenlight

Verwandte Themen