-1

私は Swift と JSON を初めて使用するので、これがばかげている場合はご容赦ください。この特定の JSON http://jsonplaceholder.typicode.com/usersを迅速に解析しようとしています。http://jsonplaceholder.typicode.com/users/1と入力して 1 人のユーザーの値を取得できますが、一度に1 人のユーザーの値しか提供されないという問題があります。すべてのユーザーの値を一度に取得する方法を探しています。

SwiftyJSON API を使用しています。

これは私が使用しているコードです:

//  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

}   

}
4

2 に答える 2

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)
于 2015-05-10T07:00:47.750 に答える