Swift NSMutableDictionary 解析 json 失败
Swift NSMutableDictionary parsing json fails
我对 NSMutableDictionary 和 Alamofire json 响应有一些奇怪的解析问题。
Alamofire.request(.POST, "\(Constants.apiUrl)/get_stuff", parameters: mapData, encoding:.JSON)
.responseJSON { response in
switch response.result {
case .Success(let data):
let info = data as! NSMutableDictionary
self.deleteCategoryFromCoreData()
if let categoryArray = info["category"] as? NSArray{
for var i = 0; i < categoryArray.count; i++ {
self.categoryID = categoryArray[i]["id"] as? Int <-- error here
self.categoryName = categoryArray[i]["name"] as? NSString
self.saveCategoryDataToCoreData()
}
}
我不知道为什么会失败:
(lldb) po categoryArray[i]["id"]
2016-05-23 20:59:56.892 MyProject[9799:5005782] -[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000013
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.
但这并没有失败:
(lldb) po categoryArray[i]["name"]
▿ Optional<String>
- Some : "Animals"
这是数据:
(lldb) po categoryArray[i]
▿ 2 elements
▿ [0] : 2 elements
- .0 : id
▿ [1] : 2 elements
- .0 : name
- .1 : Animals
为什么我无法访问 "id" 密钥?我不能像这样解析 json 吗?有人告诉我尝试 SwiftyJSON,这种方式根本不可能。所有这些问题都发生在我更新到 Xcode 7.3 和 cocoapods 1.0.0.
之后
基础集合类型不包含类型信息,可变版本 NSMutableArray
和 NSMutableDictionary
与 Swift 对应版本完全无关。
对所有内容使用 Swift 本机类型
Alamofire.request(.POST, "\(Constants.apiUrl)/get_stuff", parameters: mapData, encoding:.JSON)
.responseJSON { response in
switch response.result {
case .Success(let data):
let info = data as! [String:AnyObject]
self.deleteCategoryFromCoreData()
if let categoryArray = info["category"] as? [[String:AnyObject]] {
for category in categoryArray {
self.categoryID = category["id"] as? Int
self.categoryName = category["name"] as? String
self.saveCategoryDataToCoreData()
}
}
如果您仍然收到错误,则说明键 id
的值是一个字符串
if let id = category["id"] as? String {
self.categoryID = Int(id)
}
PS:考虑将重复循环中的所有值分别分配给相同的变量categoryID
和categoryName
,这意味着该值将在每次迭代中被覆盖。
我对 NSMutableDictionary 和 Alamofire json 响应有一些奇怪的解析问题。
Alamofire.request(.POST, "\(Constants.apiUrl)/get_stuff", parameters: mapData, encoding:.JSON)
.responseJSON { response in
switch response.result {
case .Success(let data):
let info = data as! NSMutableDictionary
self.deleteCategoryFromCoreData()
if let categoryArray = info["category"] as? NSArray{
for var i = 0; i < categoryArray.count; i++ {
self.categoryID = categoryArray[i]["id"] as? Int <-- error here
self.categoryName = categoryArray[i]["name"] as? NSString
self.saveCategoryDataToCoreData()
}
}
我不知道为什么会失败:
(lldb) po categoryArray[i]["id"]
2016-05-23 20:59:56.892 MyProject[9799:5005782] -[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000013
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.
但这并没有失败:
(lldb) po categoryArray[i]["name"]
▿ Optional<String>
- Some : "Animals"
这是数据:
(lldb) po categoryArray[i]
▿ 2 elements
▿ [0] : 2 elements
- .0 : id
▿ [1] : 2 elements
- .0 : name
- .1 : Animals
为什么我无法访问 "id" 密钥?我不能像这样解析 json 吗?有人告诉我尝试 SwiftyJSON,这种方式根本不可能。所有这些问题都发生在我更新到 Xcode 7.3 和 cocoapods 1.0.0.
之后基础集合类型不包含类型信息,可变版本 NSMutableArray
和 NSMutableDictionary
与 Swift 对应版本完全无关。
对所有内容使用 Swift 本机类型
Alamofire.request(.POST, "\(Constants.apiUrl)/get_stuff", parameters: mapData, encoding:.JSON)
.responseJSON { response in
switch response.result {
case .Success(let data):
let info = data as! [String:AnyObject]
self.deleteCategoryFromCoreData()
if let categoryArray = info["category"] as? [[String:AnyObject]] {
for category in categoryArray {
self.categoryID = category["id"] as? Int
self.categoryName = category["name"] as? String
self.saveCategoryDataToCoreData()
}
}
如果您仍然收到错误,则说明键 id
的值是一个字符串
if let id = category["id"] as? String {
self.categoryID = Int(id)
}
PS:考虑将重复循环中的所有值分别分配给相同的变量categoryID
和categoryName
,这意味着该值将在每次迭代中被覆盖。