我有下面的json但无法弄清楚如何在Swift 3中解析它。我的代码如下。 API中的json有一个数组根。我正在使用Xcode 8.2.1与Swift 4和Alamofire 4.0。
["items": <__NSArrayM 0x608000248af0>(
{
currency = USD;
image = "https://cdn.myDomain.com/image.jpg";
"item_title" = "Antique Table";
"name:" = "";
price = 675;
},
{
currency = USD;
image = "https://cdn.mydomain.com/image2.jpg";
"name:" = "";
price = 950;
...
这是我的代码。我试图从结果中获取一个数组r字典,但它总是为零。
Alamofire.request(myURL)
.responseJSON(completionHandler: {
response in
self.parseData(JSONData: response.data!)
})
}
func parseData(JSONData: Data) {
do {
let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options:.mutableContainers) as! [String: Any]
print(readableJSON)
}
catch {
print(error)
}
}
我已经尝试了这个let item = readableJSON["items"] as? [[String: Any]]
建议here但它不会编译错误[String:Any] has no subscript
和let item = readableJSON["items"] as? [String: Any]!
编译与警告Expression implicitly coerced from string
但产生零。解析这个json对我来说是生死攸关的。
做点什么
let responseJSON = response.result.value as! [String:AnyObject]
那么你将能够像这样访问该字典中的元素:
let infoElementString = responseJSON["infoElement"] as! String
这是我最终提出的解析json函数。这个json数据的问题在于它是数组中的字典。我是一个菜鸟,大多数答案和我看到的如何不适合我的json数据。这是我最终提出的功能。
var myItems = [[String:Any]]()
然后在我的视图控制器类中
func loadMyItems() {
Alamofire.request(myItemsURL)
.responseJSON(completionHandler: {
response in
self.parseData(JSONData: response.data!)
self.collectionView.reloadData()
})
}
func parseData(JSONData: Data) {
do {
let readableJSON = try JSONSerialization.jsonObject(with: JSONData, options:.allowFragments) as! [String: Any]
let items = readableJSON["items"] as! [[String: Any]]
self.myItems = items
}
catch {
print(error)
}
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as? myCell
let dictionary = myItems[indexPath.row] as [String:Any]
if let item_title = dictionary["item_title"] as? String {
cell!.textLabel.text = item_title
print(item_title)
}
return cell!
}
Swift中的Alamofire示例3
1.首先使用两个cocoapods到你的项目。使用SwiftyJSON进行json解析
pod 'Alamofire'
pod 'SwiftyJSON'
Alamofire.request("http://era.com.bd/UserSignInSV", method: .post,parameters:["uname":txtUserId.text!,"pass":txtPassword.text!]).responseJSON{(responseData) -> Void in
if((responseData.result.value != nil)){
let jsonData = JSON(responseData.result.value)
if let arrJSON = jsonData["loginNodes"].arrayObject {
for index in 0...arrJSON.count-1 {
let aObject = arrJSON[index] as! [String : AnyObject]
let errorCode = aObject["errorCode"] as? String;
let errorMessage = aObject["errorMessage"] as? String;
if("0"==errorCode ){
//Database Login Success Action
}else{
// //Database Login Fail Action
}
}
}
}
}
// let jsonData = JSON(responseData.result.value)
if((responseData.result.value != nil)){
let swiftyJsonVar = JSON(responseData.result.value!)
if let resData = swiftyJsonVar["loginNodes"].arrayObject {
self.arrRes = resData as! [[String:AnyObject]]
}
if self.arrRes.count > 0 {
self.tableView.reloadData()
}
}
}
Swift 3中的Swift 3 Alamofire示例
导入UIKit导入Alamofire导入SwiftyJSON
class ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! customCell
cell.errorLabelName.text = arrRes[indexPath.row]["errorMessage"] as? String
}