2015-09-07 7 views
6

जब वेब सेवा (एपीआई) से JSON डिकोडिंग मैं मिल त्रुटि:स्विफ्ट JSON त्रुटि: करने के लिए प्रकार '__NSDictionaryM' का मान डाली नहीं कर सका NSArray '

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

मेरे कोड:

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

अगर मैं यूआरएल को http://localhost/fendy/getjson.php में बदलता हूं, यह बहुत अच्छा काम कर रहा है।

मैं त्रुटि मिलती है अगर मेरे यूआरएल http://bitnami.local/cscart_demo/api/users

वेब सेवा 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"}] 

वेब सेवा 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"}} 

मुझे लगता है कि यह शैली ही है, लेकिन क्यों नहीं यूआरएल http://bitnami.local/cscart_demo/api/users के साथ काम करना। कोई भी मदद कर सकता है?

उत्तर

4

बिट्टनाम प्रतिक्रिया { से शुरू होती है और इसलिए यह JSON object है, जो NSDictionary से मेल खाती है। दूसरा एक [ से शुरू होता है जो एक सरणी इंगित करता है।

आप इस प्रकार Dictionary<String, AnyObject> को json के प्रकार बदलने के लिए, और deserialize की जरूरत है:

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

? यह संभव है? तालिका में देखें CellforRowIndexPath मैं बदलता हूं: var जानकारी: AnyObject? = जेसन [indexpath.row]? – fendy

0

आपका विधि एक सरणी के लिए JSON परिणाम कास्टिंग है। यह यूआरएल के साथ ठीक काम करता है जो जेएसओएन के रूप में प्रदर्शित एक सरणी देता है, लेकिन यह यूआरएल के साथ काम नहीं करता है जो एक शब्दकोश देता है, एक सरणी नहीं, जेएसओएन के रूप में प्रतिनिधित्व करता है।

हालांकि लौटाए गए मूल्यों की "शैली" समान दिखती है, दूसरा एक आइटम वस्तु है। आप जो चाहते हैं वह "users" तत्व निकालना है, जो एक सरणी है।

आप जो दो यूआरएल आप हो रही है, आप as? साथ दोनों शैलियों as! के बजाय डाली की कोशिश कर सकते पता नहीं है: अगर मैं json प्रकार के डेटा का उपयोग कर NSDictionary

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

तो, डेटा वैरिएबल जेसन को NSDictionary टाइप करना चाहिए? मुझे आपके उदाहरण का पालन करते समय त्रुटि मिलती है: यदि एआरआर दें? ऐरे {// एक शर्त में बाध्यकारी परिवर्तक की आवश्यकता है प्रारंभिक – fendy

+0

@fendy आप सही हैं, मैं असाइनमेंट करना भूल गया। अब इसे आजमाओ। – dasblinkenlight

संबंधित मुद्दे