我有下面的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)
}
}
我按照建议here尝试了这个let item = readableJSON["items"] as? [[String: Any]]
但是它不会编译错误[String:Any] has no subscript
和let item = readableJSON["items"] as? [String: Any]!
编译时出现警告Expression implicitly coerced from string
但是产生了nil 。解析这个json对我来说是生死攸关的。
答案 0 :(得分:3)
执行类似
的操作 let responseJSON = response.result.value as! [String:AnyObject]
然后您就可以像这样访问该词典中的元素:
let infoElementString = responseJSON["infoElement"] as! String
答案 1 :(得分:0)
这是我最终提出的解析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!
}
答案 2 :(得分:0)
Swift 3中的Alamofire示例
1.首先在您的项目中使用两个cocoapods。使用SwiftyJSON进行json解析
pod 'Alamofire'
pod 'SwiftyJSON'
我的Json在
之下{“loginNodes”:[{“errorMessage”:“Welcome to Alamofire”,“name”:Enamul Haque,“errorCode”:“0”,“photo”:null}]}
可以用不同的方式完成。但我已经完成了以下方式。请注意,如果您不需要任何参数来发送服务器,则删除参数选项。它可以工作post或get方法。你可以用任何方式。我的Alamofire代码如下......这对我来说很好......
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
}
}
}
}
}
如果你使用Like表View Or Collection View等,你就可以这样使用..
声明数组
var arrRes = [String:AnyObject]
将值分配给数组,如
if((responseData.result.value!= nil)){
// 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()
}
}
}
在taleView,cellForRowAt indexPath中,只需使用
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! customCell
cell.errorLabelName.text = arrRes[indexPath.row]["errorMessage"] as? String
答案 3 :(得分:0)
导入UIKit 进口Alamofire 导入SwiftyJSON
类ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {
var array = [[String:AnyObject]]()
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
Alamofire.request("http://www.designer321.com/johnsagar/plumbingapp/webservice/list_advertise.php?zip=123456").responseJSON { (responseData) -> Void in
if((responseData.result.value) != nil)
{
let swiftyJsonVar = JSON(responseData.result.value!)
print("Main Responce")
print(swiftyJsonVar)
}
if let result = responseData.result.value
{
if let Res = (result as AnyObject).value(forKey: "response") as? NSDictionary
{
if let Hallo = (Res as AnyObject).value(forKey: "advertise_list") as? NSArray
{
print("-=-=-=-=-=-=-")
print(Hallo)
self.array = Hallo as! [[String:AnyObject]]
print(self.array)
}
}
self.tableview.reloadData()
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return array.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
var dict = array[indexPath.row]
cell.lbl1.text = dict["address"] as? String
cell.lbl2.text = dict["ad_created_date"] as? String
cell.lbl3.text = dict["phone_number"] as? String
cell.lbl4.text = dict["id"] as? String
cell.lbl5.text = dict["ad_zip"] as? String
let imageUrlString = dict["ad_path"]
let imageUrl:URL = URL(string: imageUrlString as! String)!
let imageData:NSData = NSData(contentsOf: imageUrl)!
cell.img.image = UIImage(data: imageData as Data)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 100
}
}