Cómo analizar un archivo JSON en swift?

Tengo un archivo JSON, quiero analizar y usar la lista de objetos en la vista de tabla. ¿Alguien puede compartir el código para analizar rápidamente el archivo JSON?

No podría ser más simple:

import Foundation var error: NSError? let jsonData: NSData = /* get your json data */ let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary 

Hacer la solicitud de la API

 var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false) 

Preparándose para la respuesta

Declara una matriz como abajo

 var data: NSMutableData = NSMutableData() 

Recibiendo la respuesta

1.

 func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { // Received a new request, clear out the data object self.data = NSMutableData() } 

2.

 func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { // Append the received 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() } } 

Cuando NSURLConnection recibe una respuesta, podemos esperar que el método didReceiveResponse sea llamado en nuestro nombre. En este punto, simplemente restablecemos nuestros datos diciendo self.data = NSMutableData (), creando un nuevo objeto de datos vacío.

Después de establecer una conexión, comenzaremos a recibir datos en el método didReceiveData. El argumento de datos que se transmite aquí es de donde proviene toda nuestra información jugosa. Necesitamos aferrarnos a cada fragmento que entra, por lo que lo agregamos al objeto self.data que hemos eliminado anteriormente.

Finalmente, cuando se realiza la conexión y se han recibido todos los datos, se llama a connectionDidFinishLoading y estamos listos para utilizar los datos en nuestra aplicación. ¡Hurra!

El método connectionDidFinishLoading utiliza aquí la clase NSJSONSerialization para convertir nuestros datos brutos en objetos del Diccionario útiles deserializando los resultados de su Url.

Acabo de escribir una clase llamada JSON, que hace que el manejo de JSON en Swift sea tan fácil como el objeto JSON en ES5.

Convierta su objeto rápido en JSON así:

 let obj:[String:AnyObject] = [ "array": [JSON.null, false, 0, "",[],[:]], "object":[ "null": JSON.null, "bool": true, "int": 42, "double": 3.141592653589793, "string": "a α\t弾\n𪚲", "array": [], "object": [:] ], "url":"http://blog.livedoor.com/dankogai/" ] let json = JSON(obj) json.toString() 

… o cuerda …

 let json = JSON.parse("{\"array\":[...}") 

… o URL.

 let json = JSON.fromURL("http://api.dan.co.jp/jsonenv") Tree Traversal 

Simplemente atraviesa elementos a través del subíndice:

 json["object"]["null"].asNull // NSNull() // ... json["object"]["string"].asString // "a α\t弾\n𪚲" json["array"][0].asNull // NSNull() json["array"][1].asBool // false // ... 

Al igual que SwiftyJSON , no te preocupes si la entrada subscripta no existe.

 if let b = json["noexistent"][1234567890]["entry"].asBool { // .... } else { let e = json["noexistent"][1234567890]["entry"].asError println(e) } 

Si está cansado de los subíndices, agregue su esquema de la siguiente manera:

 //// schema by subclassing class MyJSON : JSON { init(_ obj:AnyObject){ super.init(obj) } init(_ json:JSON) { super.init(json) } var null :NSNull? { return self["null"].asNull } var bool :Bool? { return self["bool"].asBool } var int :Int? { return self["int"].asInt } var double:Double? { return self["double"].asDouble } var string:String? { return self["string"].asString } } 

Y tú vas:

 let myjson = MyJSON(obj) myjson.object.null myjson.object.bool myjson.object.int myjson.object.double myjson.object.string // ... 

Espero que te guste.

Con el nuevo xCode 7.3+ es importante agregar su dominio a la lista de excepciones ( ¿Cómo puedo agregar NSAppTransportSecurity a mi archivo info.plist? ), Consulte las instrucciones en esta publicación, de lo contrario, obtendrá un error de la autoridad de transporte.

Aquí hay un código para hacer las conversiones entre JSON y NSData en Swift 2.0

 // Convert from NSData to json object func nsdataToJSON(data: NSData) -> AnyObject? { do { return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) } catch let myJSONError { print(myJSONError) } return nil } // Convert from JSON to nsdata func jsonToNSData(json: AnyObject) -> NSData?{ do { return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted) } catch let myJSONError { print(myJSONError) } return nil; } 

También escribí una pequeña biblioteca que está especializada para el mapeo de la respuesta json en una estructura de objeto. Estoy usando internamente la biblioteca json-swift de David Owens. Tal vez sea útil para otra persona.

https://github.com/prine/ROJSONParser

Empleados de ejemplo.json

 { "employees": [ { "firstName": "John", "lastName": "Doe", "age": 26 }, { "firstName": "Anna", "lastName": "Smith", "age": 30 }, { "firstName": "Peter", "lastName": "Jones", "age": 45 }] } 

Como siguiente paso, debe crear su modelo de datos (EmplyoeeContainer y Employee).

Empleado.swift

 class Employee : ROJSONObject { required init() { super.init(); } required init(jsonData:AnyObject) { super.init(jsonData: jsonData) } var firstname:String { return Value.get(self, key: "firstName") } var lastname:String { return Value.get(self, key: "lastName") } var age:Int { return Value.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] }() } 

Entonces, para asignar realmente los objetos de la respuesta JSON, solo tiene que pasar los datos a la clase EmployeeContainer como param en el constructor. Crea automáticamente su modelo de datos.

  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 salida de la consola se ve así como la siguiente:

 Firstname: John Lastname: Doe age: 26 Firstname: Anna Lastname: Smith age: 30 Firstname: Peter Lastname: Jones age: 45 

SwiftJSONParse : Parse JSON como un rudo

Dead-simple y fácil de leer!

Ejemplo: obtener el valor "mrap" de los nicknames como una cadena de esta respuesta JSON

 { "other": { "nicknames": ["mrap", "Mikee"] } 

Toma sus datos de json NSData tal como están, sin necesidad de preprocesar.

 let parser = JSONParser(jsonData) if let handle = parser.getString("other.nicknames[0]") { // that's it! } 

Descargo de responsabilidad: hice esto y espero que ayude a todos. ¡Siéntase libre de mejorarlo!

El análisis de JSON en Swift es un excelente trabajo para la generación de código. Creé una herramienta en http://www.guideluxe.com/JsonToSwift para hacer eso.

Proporciona un objeto JSON de muestra con un nombre de clase y la herramienta generará una clase Swift correspondiente, así como cualquier clase auxiliar Swift necesaria, para representar la estructura implícita en la muestra JSON. También se incluyen los métodos de clase utilizados para poblar objetos Swift, incluido uno que utiliza el método NSJSONSerialization.JSONObjectWithData. Se proporcionan los mapeos necesarios de los objetos NSArray y NSDictionary.

A partir del código generado, solo necesita suministrar un objeto NSData que contenga JSON que coincida con la muestra proporcionada a la herramienta.

Aparte de Foundation, no hay dependencias.

Mi trabajo fue inspirado por http://json2csharp.com/ , que es muy útil para proyectos .NET.

A continuación, se explica cómo crear un objeto NSData a partir de un archivo JSON.

 let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")! let jsonData: NSData = NSData(contentsOfURL: fileUrl)! 

Paso 1. Instalar Swifty Json https://github.com/SwiftyJSON/SwiftyJSON

Nota: si está buscando esto, también hay una gran posibilidad de que no sepa cómo instalar swifty. Siga las instrucciones en https://guides.cocoapods.org/using/getting-started.html#toc_3

sudo joya instalar cocoapods

cd ~ / Path / To / Folder / Containing / ShowTracker

Luego ingrese este comando:

pod init

Esto creará un Podfile predeterminado para su proyecto. El Podfile es donde defines las dependencias de las que depende tu proyecto.

Escriba este comando para abrir Podfile usando Xcode para editar:

abrir un archivo de archivos Xcode

Agregue el Swifty al archivo podfile

 platform :ios, '8.0' use_frameworks! target 'MyApp' do pod 'SwiftyJSON', '~> XXX' end 

Paso 2. Verifica este ejemplo

 var mURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric") if mURL == nil{ println("You are stupid") return } var request = NSURLRequest(URL: mURL!) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in if data != nil { var mJSON = JSON(data: data!) if let current_conditions = mJSON["weather"][0]["description"].string{ println("Current conditions: " + current_conditions) } else { println("MORON!") } if let current_temperature = mJSON["main"]["temp"].double{ println("Temperature: "+ String(format:"%.f", current_temperature) + "°C" } else { println("MORON!") } } }) 

Paso 3. Beneficio

Usando ObjectMapper framework

 if let path = Bundle(for: BPPView.self).path(forResource: jsonFileName, ofType: "json") { do { let data = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.mappedIfSafe) let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) self.levels = Mapper().mapArray(JSONArray: (json as! [[String : Any]]))! print(levels.count) } catch let error as NSError { print(error.localizedDescription) } } else { print("Invalid filename/path.") } 

Antes debe preparar el conjunto de objetos apropiados: Mappable para analizar en

 import UIKit import ObjectMapper class Level: Mappable { var levelName = "" var levelItems = [LevelItem]() required init?(map: Map) { } // Mappable func mapping(map: Map) { levelName <- map["levelName"] levelItems <- map["levelItems"] } } 

  import UIKit import ObjectMapper class LevelItem: Mappable { var frontBackSide = BPPFrontBack.Undefined var fullImageName = "" var fullImageSelectedName = "" var bodyParts = [BodyPart]() required init?(map: Map) { } // Mappable func mapping(map: Map) { frontBackSide <- map["frontBackSide"] fullImageName <- map["fullImageName"] fullImageSelectedName <- map["fullImageSelectedName"] bodyParts <- map["bodyParts"] }} 

Swift 3

 let parsedResult: [String: AnyObject] do { parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject] } catch { // Display an error or return or whatever } 

datos – es Tipo de datos (Estructura) (es decir, devuelto por alguna respuesta del servidor)

El controlador de vista completo que muestra los datos en la vista de recostackción utilizando dos métodos de json parsig

 @IBOutlet weak var imagecollectionview: UICollectionView! lazy var data = NSMutableData() var dictdata : NSMutableDictionary = NSMutableDictionary() override func viewDidLoad() { super.viewDidLoad() startConnection() startNewConnection() // Do any additional setup after loading the view, typically from a nib. } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dictdata.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CustomcellCollectionViewCell", forIndexPath: indexPath) as! CustomcellCollectionViewCell cell.name.text = dictdata.valueForKey("Data")?.valueForKey("location") as? String let url = NSURL(string: (dictdata.valueForKey("Data")?.valueForKey("avatar_url") as? String)! ) LazyImage.showForImageView(cell.image, url:"URL return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let kWhateverHeightYouWant = 100 return CGSizeMake(self.view.bounds.size.width/2, CGFloat(kWhateverHeightYouWant)) } func startNewConnection() { let url: URL = URL(string: "YOUR URL" as String)! let session = URLSession.shared let request = NSMutableURLRequest(url: url as URL) request.httpMethod = "GET" //set the get or post according to your request // request.cachePolicy = NSURLRequest.CachePolicy.ReloadIgnoringCacheData request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData let task = session.dataTask(with: request as URLRequest) { ( data, response, error) in guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else { print("error") return } let jsonString = NSString(data: data!, encoding:String.Encoding.utf8.rawValue) as! String } task.resume() } func startConnection(){ let urlPath: String = "your URL" let url: NSURL = NSURL(string: urlPath)! var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)! connection.start() } func connection(connection: NSURLConnection!, didReceiveData data: NSData!){ self.data.appendData(data) } func buttonAction(sender: UIButton!){ startConnection() } func connectionDidFinishLoading(connection: NSURLConnection!) { do { let JSON = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions(rawValue: 0)) guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else { print("Not a Dictionary") // put in function return } print("JSONDictionary! \(JSONDictionary)") dictdata.setObject(JSONDictionary, forKey: "Data") imagecollectionview.reloadData() } catch let JSONError as NSError { print("\(JSONError)") } } 

Este analizador usa generics para convertir tipos JSON a Swift, lo que reduce el código que necesita escribir.

https://github.com/evgenyneu/JsonSwiftson

 struct Person { let name: String? let age: Int? } let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }") let person: Person? = Person( name: mapper["name"].map(), age: mapper["age"].map() ) 

Swift2 iOs9

  let miadata = NSData(contentsOfURL: NSURL(string: "https://myWeb....php")!) do{ let MyData = try NSJSONSerialization.JSONObjectWithData(miadata!, options: NSJSONReadingOptions.MutableContainers) as? NSArray print(".........\(MyData)") } catch let error as NSError{ // error.description print(error.description) } 

Debajo hay un ejemplo de Swift Playground:

 import UIKit let jsonString = "{\"name\": \"John Doe\", \"phone\":123456}" let data = jsonString.data(using: .utf8) var jsonObject: Any do { jsonObject = try JSONSerialization.jsonObject(with: data!) as Any if let obj = jsonObject as? NSDictionary { print(obj["name"]) } } catch { print("error") } 

Swift 4 API Ejemplo de solicitud

Haga uso de JSONDecoder().decode

Ver este video Análisis JSON con Swift 4


 struct Post: Codable { let userId: Int let id: Int let title: String let body: String } 

 URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/posts")!) { (data, response, error) in guard let response = response as? HTTPURLResponse else { print("HTTPURLResponse error") return } guard 200 ... 299 ~= response.statusCode else { print("Status Code error \(response.statusCode)") return } guard let data = data else { print("No Data") return } let posts = try! JSONDecoder().decode([Post].self, from: data) print(posts) }.resume() 

Swift 4

Crear un proyecto

Diseño StoryBoard con un botón y una vista UITable

Crear TableViewCell VC

En la acción del botón Inserte los siguientes códigos

Recuerde este código para obtener matriz de datos en una API

 import UIKit class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet var tableView: UITableView! var displayDatasssss = [displyDataClass]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return displayDatasssss.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1 cell.label1.text = displayDatasssss[indexPath.row].email return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func gettt(_ sender: Any) { let url = "http://jsonplaceholder.typicode.com/users" var request = URLRequest(url: URL(string: url)!) request.httpMethod = "GET" let configuration = URLSessionConfiguration.default let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) let task = session.dataTask(with: request){(data, response,error)in if (error != nil){ print("Error") } else{ do{ // Array of Data let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray for eachData in fetchData { let eachdataitem = eachData as! [String : Any] let name = eachdataitem["name"]as! String let username = eachdataitem["username"]as! String let email = eachdataitem["email"]as! String self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email)) } self.tableView.reloadData() } catch{ print("Error 2") } } } task.resume() } } class displyDataClass { var name : String var username : String var email : String init(name : String,username : String,email :String) { self.name = name self.username = username self.email = email } } 

Esto es para la obtención de datos del diccionario

 import UIKit class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet var tableView: UITableView! var displayDatasssss = [displyDataClass]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return displayDatasssss.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1 cell.label1.text = displayDatasssss[indexPath.row].email return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func gettt(_ sender: Any) { let url = "http://jsonplaceholder.typicode.com/users/1" var request = URLRequest(url: URL(string: url)!) request.httpMethod = "GET" let configuration = URLSessionConfiguration.default let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) let task = session.dataTask(with: request){(data, response,error)in if (error != nil){ print("Error") } else{ do{ //Dictionary data Fetching let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! [String: AnyObject] let name = fetchData["name"]as! String let username = fetchData["username"]as! String let email = fetchData["email"]as! String self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email)) self.tableView.reloadData() } catch{ print("Error 2") } } } task.resume() } } class displyDataClass { var name : String var username : String var email : String init(name : String,username : String,email :String) { self.name = name self.username = username self.email = email } }