2015-05-10 2 views
-1

Я новичок в Swift и JSON, поэтому, пожалуйста, медведь со мной, если это глупо. Я пытаюсь разобрать этот JSON http://jsonplaceholder.typicode.com/users в быстром. Я могу получить значения одного пользователя, набрав http://jsonplaceholder.typicode.com/users/1, но проблема в том, что он дает мне только значения для одного пользователя за раз. Я ищу способ получить значения всех пользователей за один раз.как разобрать этот json в swift

Я использую API SwiftyJSON.

Это код, который я использую:

// RestApiManager.swift 


import Foundation 

typealias ServiceResponse = (JSON, NSError?) -> Void 
class RestApiManager: NSObject{ 

static let sharedInstance = RestApiManager() 

let baseURL = "http://jsonplaceholder.typicode.com/users/" 

func getUser(onCompletion: (JSON) ->Void){ 
    makeHTTPGetRequest(baseURL, onCompletion: {json, err -> Void in onCompletion(json)}) 
} 


func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse){ 
    let request = NSMutableURLRequest(URL: NSURL(string: path)!) 

    let session = NSURLSession.sharedSession() 

    let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error in 

     let json:JSON = JSON(data: data) 
     onCompletion(json, error) 
    }) 
    task.resume() 

} 
} 

Это мой MasterViewController.swift класс

// 
// MasterViewController.swift 
// 
// 
import UIKit 
class MasterViewController: UITableViewController { 
var objects = [AnyObject]() 


var contactsData = NSMutableArray() //array that will hold all the contact details. 


override func awakeFromNib() { 
    super.awakeFromNib() 
} 
override func viewDidLoad() { 

    super.viewDidLoad() 
    getContactListJSON() 

} 

func getContactListJSON(){ 

     RestApiManager.sharedInstance.getUser { json -> Void in 
     let user: AnyObject = json["id"].object 
     self.contactsData.addObject(user) 
     println(self.contactsData) 
    } 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


// MARK: - Table View 
override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return contactsData.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell = tableView.dequeueReusableCellWithIdentifier("CELL", forIndexPath: indexPath) as? UITableViewCell 


    return cell 

} 

} 

ответ

1

На самом деле это очень просто. Просто сделать что-то вроде этого, и он будет работать:

func getContactListJSON(){ 
    let urlString = "http://jsonplaceholder.typicode.com/users" 
    let urlEncodedString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 
    let url = NSURL(string: urlEncodedString!) 
    var task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, innerError) in 
     let json = JSON(data: data) 
     let contactsArray = json.arrayValue 

     dispatch_async(dispatch_get_main_queue(), { 
      for contacts in contactsArray 
      { 
       let id = contacts["id"].stringValue 
       let name = contacts["name"].stringValue 
       println("id: \(id) name: \(name)") 
      } 
     }) 
    } 
    task.resume() 
} 

Я в сомнении swiftyJSON есть некоторая информация here

+0

PS, если «id» всегда является int, вы также можете сделать: let id = contacts ["id"]. IntValue – user1700737

+0

Большое спасибо! Он работает отлично! Еще один вопрос в моем сознании, что произойдет, если let id равен нулю? –

+0

Привет. Тогда значение будет равно нулю. Вы действительно должны сделать что-то вроде этого: var id: String? if let id = contacts ["id"]. stringValue {// делать что-то с id} else {делать что-то еще или ничего}. Если вы считаете, что ответ правильный, pls отметьте мой пост как ответ и проголосуйте за него. Большое спасибо – user1700737

0

Вот простая реализация, как разобрать массив JSON вы перечисленных выше , Обратите внимание, что это не проверяет правильность всех случаев, когда значение json равно nil. Поэтому используйте опциональную проверку, чтобы убедиться, что она не сбой.

class Geolocation { 
    var latitude: String! 
    var longitude: String! 
} 

class Company: Printable { 
    var name: String! 
    var bs: String! 
    var catchPhrase: String! 

    var description: String { 
     get { 
      return "\(name), catchPhrase: \(catchPhrase)" 
     } 
    } 
} 

class Address: Printable { 

    var description: String { 
     return "City: \(city), Street: \(street), suite: \(suite), zipCode: \(zipCode), geocode: \(geocode)" 
    } 
    var city: String! 
    var street: String! 
    var suite: String! 
    var zipCode: String! 

    var geocode: Geolocation! 
} 

class Person: Printable { 

    var description: String { 
     get { 
      return "identifier: \(identifier) name:\(name) email:\(email) phone:\(phone) username:\(userName) website:\(website)\n Company: \(company), Address: \(address)" 
     } 
    } 

    var identifier: Int! 
    var name: String! 
    var email: String! 
    var phone: String! 
    var userName: String! 
    var website: String! 

    var company: Company! 
    var address: Address! 


} 


func createCompany(companyDict: NSDictionary) -> Company { 
    let company = Company() 
    company.name = companyDict["name"] as! String 
    company.catchPhrase = companyDict["catchPhrase"] as! String 
    company.bs = companyDict["bs"] as! String 
    return company 
} 

func createGeolocation(geoDict: NSDictionary) -> Geolocation { 
    let geo = Geolocation() 
    geo.latitude = geoDict["lat"] as? String 
    geo.longitude = geoDict["lng"] as? String 
    return geo 
} 


func createAddress(addressDict: NSDictionary) -> Address { 
    let address = Address() 
    address.street = addressDict["street"] as? String 
    address.suite = addressDict["suite"] as? String 
    address.city = addressDict["city"] as? String 
    address.zipCode = addressDict["zipCode"] as? String 
    address.geocode = createGeolocation(addressDict["geo"] as! NSDictionary) 
    return address 
} 


func createPerson(personDict: NSDictionary) -> Person { 
    let person = Person() 

    if let identifier = personDict["id"] as? Int { 
     person.identifier = identifier 
    } 

    if let name = personDict["name"] as? String { 
     person.name = name 
    } 

    if let email = personDict["email"] as? String { 
     person.email = email 
    } 

    if let phone = personDict["phone"] as? String { 
     person.phone = phone 
    } 

    if let username = personDict["username"] as? String { 
     person.userName = username 
    } 

    if let website = personDict["website"] as? String { 
     person.website = website 
    } 

    person.company = createCompany(personDict["company"] as! NSDictionary) 
    person.address = createAddress(personDict["address"] as! NSDictionary) 
    return person 
} 



let data = NSData(contentsOfFile: "/Users/Jackson/Desktop/MyPlayground.playground/Resources/test.json") 
let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data!, options: .allZeros, error: nil) 

var personArray = [Person]() 

for dict in json as! NSArray { 

    if let personDict = dict as? NSDictionary { 
      personArray += [createPerson(personDict)] 
    } 
} 

println(personArray) 
+0

Я действительно ценю вашу помощь! Но с этой реализацией нам нужно будет проверить все случаи, когда значение json равно нулю. Есть ли способ сделать это с помощью кода, который я использую? –

+0

Вместо того, чтобы создавать человека модели, просто используйте тот же NSArray, чтобы заполнить таблицу, это должно быть довольно простым. – Sandeep

+0

Я имел в виду, есть ли способ сделать это с помощью SwiftyJSON? –