J'ai un fichier JSON, je veux analyser et utiliser une liste d'objets en vue tableau. Quelqu'un peut-il partager le code pour analyser le fichier JSON en format swift?
Réponses
Trop de publicités?comment Appeler le service Web et vous avez Réponse à swift Vérifier
Faire la Demande d'API
var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
La préparation pour la réponse
Déclarer Tableau comme ci-dessous
var data: NSMutableData = NSMutableData()
Réception de la réponse
1.
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
// Recieved a new request, clear out the data object
self.data = NSMutableData()
}
2.
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
// Append the recieved chunk of data to our data object
self.data.appendData(data)
}
3.
func connectionDidFinishLoading(connection: NSURLConnection!) {
// Request complete, self.data should now hold the resulting info
// Convert the retrieved data in to an object through JSON deserialization
var err: NSError
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
if jsonResult.count>0 && jsonResult["results"].count>0 {
var results: NSArray = jsonResult["results"] as NSArray
self.tableData = results
self.appsTableView.reloadData()
}
}
Lorsque NSURLConnection reçoit une réponse, on peut s'attendre à la didReceiveResponse méthode à appeler sur notre compte. À ce stade, il suffit de réinitialiser nos données en disant auto.données = NSMutableData(), la création d'un nouveau vide d'objet de Données.
Après une connexion est établie, nous allons commencer à recevoir des données dans la méthode didReceiveData. Les données argument qui est passée ici est l'endroit où tous nos juteux information. Nous avons besoin de s'accrocher à chaque morceau qui vient, ce qui nous ajouter à l'auto.objet de données nous avons dégagé plus tôt.
Enfin, lorsque la connexion est établie et l'ensemble des données a été reçu, connectionDidFinishLoading est appelé et nous sommes prêts à utiliser les données dans notre application. Hourra!
Le connectionDidFinishLoading méthode utilise ici la NSJSONSerialization classe pour convertir nos données brutes en utile Dictionnaire des objets par la désérialisation les résultats de Votre Url.
Je viens d'écrire une classe appelée JSON, qui rend la gestion JSON dans Swift aussi simple que l'objet JSON dans ES5.
Transformez votre objet swift en JSON comme suit:
let obj:[String:AnyObject] = [
"array": [JSON.null, false, 0, "",[],[:]],
"object":[
"null": JSON.null,
"bool": true,
"int": 42,
"double": 3.141592653589793,
"string": "a α\t弾\n
J'ai aussi écrit une petite bibliothèque spécialisée pour la cartographie de la réponse json dans une structure d'objet. Je suis à l'interne à l'aide de la bibliothèque json-rapide de David Owens. C'est peut-être utile pour quelqu'un d'autre.
https://github.com/prine/ROJSONParser
Exemple Les Employés.json
{
"employees": [
{
"firstName": "John",
"lastName": "Doe",
"age": 26
},
{
"firstName": "Anna",
"lastName": "Smith",
"age": 30
},
{
"firstName": "Peter",
"lastName": "Jones",
"age": 45
}]
}
Comme étape suivante, vous devez créer votre modèle de données (EmplyoeeContainer et de l'Employé).
De l'employé.swift
class Employee : ROJSONObject {
required init() {
super.init();
}
required init(jsonData:AnyObject) {
super.init(jsonData: jsonData)
}
var firstname:String {
return Value<String>.get(self, key: "firstName")
}
var lastname:String {
return Value<String>.get(self, key: "lastName")
}
var age:Int {
return Value<Int>.get(self, key: "age")
}
}
EmployeeContainer.swift
class EmployeeContainer : ROJSONObject {
required init() {
super.init();
}
required init(jsonData:AnyObject) {
super.init(jsonData: jsonData)
}
lazy var employees:[Employee] = {
return Value<[Employee]>.getArray(self, key: "employees") as [Employee]
}()
}
Ensuite, pour mettre en carte les objets de la réponse JSON, vous n'avez qu'à transmettre les données dans le EmployeeContainer classe en tant que paramètre dans le constructeur. Il ne de créer automatiquement votre modèle de données.
var baseWebservice:BaseWebservice = BaseWebservice();
var urlToJSON = "http://prine.ch/employees.json"
var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in
for employee in employeeContainer.employees {
println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")
}
}
baseWebservice.get(urlToJSON, callback:callbackJSON)
La sortie de la console semble alors comme suit:
Firstname: John Lastname: Doe age: 26
Firstname: Anna Lastname: Smith age: 30
Firstname: Peter Lastname: Jones age: 45
SwiftJSONParse: Parser JSON comme un badass
Morts-simple et facile à lire!
Exemple: obtenir la valeur "mrap"
de nicknames
comme une Chaîne de caractères à partir de cette réponse JSON
{
"other": {
"nicknames": ["mrap", "Mikee"]
}
Il prend vos données json NSData
comme il est, pas besoin de prétraiter.
let parser = JSONParser(jsonData)
if let handle = parser.getString("other.nicknames[0]") {
// that's it!
}
Avertissement: j'ai fait cela et j'espère que cela aide tout le monde. N'hésitez pas à améliorer!