Swift:使用Alamofire和SwiftyJSON处理JSON

vk7*_*k72 8 json ios swift alamofire

这肯定会被问到几次,但我还没有找到正确的答案,尽管我一直很努力.

我使用Alamofire和SwiftyJSON,我的JSON数据看起来像这样:

{
  "528" : {
    "name" : "Name 1",
    "id" : "528",
    "product_id" : null,
    "visible" : "0",
    "level" : "2"
  },
  "29" : {
    "name" : "Name 2",
    "id" : "29",
    "product_id" : null,
    "visible" : "1",
    "level" : "1"
  },
  "173" : {
    "name" : "Name 3",
    "id" : "173",
    "product_id" : null,
    "visible" : "0",
    "level" : "2"
  },
  "143" : {
    "name" : "Name 4",
    "id" : "143",
    "product_id" : null,
    "visible" : "1",
    "level" : "2"
  },
Run Code Online (Sandbox Code Playgroud)

...使用此代码:

Alamofire.request(.GET, dataURL, parameters: nil, encoding: .JSON)

    .responseJSON { (request, response, jsonData, error) in

        let json = JSON(jsonData!) 

        println(json)

    }
Run Code Online (Sandbox Code Playgroud)

...所以JSON一切都应该没问题

  1. 我如何访问该数据?我的意思是我如何获得名称,ID,product_ids等

  2. 我怎样才能将这些数据(名称)放到我的TableViewController中?

Jon*_*han 14

我在我的一个项目中使用SwiftyJSON和Alamofire.这是我如何使用它.

  1. 创建一个名为APIProtocol的协议.
  2. 使用GET方法设置API类,该方法接受APIProtocol类型的委托.
  3. 设置TableViewController以实现APIProtocol.
  4. 从TableViewController调用API.get()

// Step 1
protocol APIProtocol {
  func didReceiveResult(results: JSON)
}

// Step 2
func get(path: String, parameters: [String: AnyObject]? = nil, delegate: APIProtocol? = nil){
  let url = "\(self.hostname)\(path)"
  NSLog("Preparing for GET request to: \(url)")

  Alamofire.request(.GET, url, parameters: parameters)
    .responseJSON { (req, res, json, error) in
      if(error != nil) {
        NSLog("GET Error: \(error)")
        println(res)
      }
      else {
        var json = JSON(json!)
        NSLog("GET Result: \(json)")

        // Call delegate if it was passed into the call
        if(delegate != nil) {
            delegate!.didReceiveResult(json)
        }
      }
    }
}

// Step 3
class ActivityViewController: UITableViewController, APIProtocol {
  var activityModelList: NSMutableArray = [] // This is the array that my tableView is using.

  ... 

  func didReceiveResult(result: JSON) {
    var activities: NSMutableArray = []

    NSLog("Activity.didReceiveResult: \(result)")

    for (index: String, activity: JSON) in result {

      var activityModel = ActivityModel(
        id: activity["id"].intValue,
        message: activity["message"].stringValue
      )

      activities.addObject(activityModel)
    }

    // Set our array of new models
    activityModelList = activities

    // Make sure we are on the main thread, and update the UI.
    dispatch_sync(dispatch_get_main_queue(), {
      self.refreshControl!.endRefreshing()
      self.tableView.reloadData()
    })
  }
}

// Step 4
override func viewDidLoad() {
  MyAPI.get("/activities", delegate: self)
}
Run Code Online (Sandbox Code Playgroud)


Gly*_*ard 4

访问器(至少对于 SwiftyJSON)的工作方式如下:

if let userName = json[0]["528"]["name"].string{
    println(userName) // "Name 1"
}
Run Code Online (Sandbox Code Playgroud)

有关如何使用 SwiftyJSOn 的更多信息可以在其官方文档中找到: https: //github.com/SwiftyJSON/SwiftyJSON

关于如何将数据放入 UITableView 中,有很多方法。例如,设置一个 UITableView 单元格,然后将 JSON 数据加载到某种数组中。