WebサービスからのJSON応答をデコードすると、次のエラーが表示されます。
Could not cast value of type '__NSArrayM' (0x34df0900) to 'NSDictionary'
StackOverflowにある非常に多くのソリューションも試してみましたが、何も機能しません。
マイコード:
let jsonData:NSDictionary = (NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSDictionary)!
let success:NSInteger = jsonData.valueForKey("success") as! NSInteger
Webサービスからの応答:
[
{
"id": "1",
"title": "bmw",
"price": "500.00",
"description": "330",
"addedDate": "2015-05-18 00:00:00",
"user_id": "1",
"user_name": "CANOVAS",
"user_zipCode": "32767",
"category_id": "1",
"category_label": "VEHICULES",
"subcategory_id": "2",
"subcategory_label": "Motos",
"bdd": {}
}
]
ご協力ありがとうございました
次の行を置き換えてみてください:
let jsonData:NSDictionary = (NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSDictionary)!
以下の場合:
let jsonData:NSArray = (NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSArray)!
これがお役に立てば幸いです。
乾杯!
SwiftyJSONを使用: https://github.com/SwiftyJSON/SwiftyJSON
let json = JSON(data: urlData!)
そして、成功がアレイにある場合
if let success = json[0]["success"].int {
//Now you got your value
}
または、成功が配列にない場合
if let success = json["success"].int {
//Now you got your value
}
成功値も確認できます
if let success = json["success"].int where success == 1 {
// Now you can do stuff
}
これは、ログを読み取る「レベル」を逃した場合に発生します。このエラーが発生し、NSMutableDictionaryの代わりにNSArrayにキャストしようとしました Swift JSON error、could not cast value of type '__NSArrayM'(0x507b58)to 'NSDictionary'(0x507d74)
オブジェクトの実際の内容は、その配列のインデックス0のNSDictionary内にありました。このコードを試してください(説明のためにいくつかのログ行を含みます)
let dataDict = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &error)
println(dataDict)
let contents = dataDict!.objectForKey("rows") as! NSMutableArray
println(contents)
println( "contents is = \(_stdlib_getDemangledTypeName(contents))")
let innerContents = contents[0]
println(innerContents)
println( "inner contents is = \(_stdlib_getDemangledTypeName(innerContents))")
let yourKey = innerContents.objectForKey("yourKey") as? String
println(yourKey)