Convierte matriz a cadena JSON en swift

¿Cómo se convierte una matriz a una cadena JSON en forma rápida? Básicamente tengo un campo de texto con un botón incrustado en él. Cuando se presiona el botón, el texto del campo de texto se agrega a testArray . Además, quiero convertir esta matriz en una cadena JSON .

Esto es lo que he intentado:

 func addButtonPressed() { if goalsTextField.text == "" { // Do nothing } else { testArray.append(goalsTextField.text) goalsTableView.reloadData() saveDatatoDictionary() } } func saveDatatoDictionary() { data = NSKeyedArchiver.archivedDataWithRootObject(testArray) newData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(), error: nil) as? NSData string = NSString(data: newData!, encoding: NSUTF8StringEncoding) println(string) } 

También me gustaría devolver la cadena JSON utilizando mi método savetoDictionart() .

Tal como está, lo estás convirtiendo en datos, luego intenta convertir los datos a un objeto como JSON (que falla, no es JSON) y convirtiéndolo en una cadena, básicamente tienes un montón de transformaciones sin sentido.

Siempre que la matriz contenga solo valores codificables JSON (cadena, número, diccionario, matriz, nulo), puede usar NSJSONSerialization para hacerlo.

En su lugar, solo haga las partes de la matriz-> datos-> cadena:

Swift 3/4

 let array = [ "one", "two" ] func json(from object:Any) -> String? { guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else { return nil } return String(data: data, encoding: String.Encoding.utf8) } print("\(json(from:array as Any))") 

Respuesta original

 let array = [ "one", "two" ] let data = NSJSONSerialization.dataWithJSONObject(array, options: nil, error: nil) let string = NSString(data: data!, encoding: NSUTF8StringEncoding) 

aunque probablemente no deberías usar el desenvolvimiento forzado, te da el punto de partida correcto.

Swift 3.0 – versión 4.0

 do { //Convert to Data let jsonData = try JSONSerialization.data(withJSONObject: dictionaryOrArray, options: JSONSerialization.WritingOptions.prettyPrinted) //Convert back to string. Usually only do this for debugging if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) { print(JSONString) } //In production, you usually want to try and cast as the root data structure. Here we are casting as a dictionary. If the root object is an array cast as [Any]. var json = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] } catch { print(error.description) } 

La opción JSONSerialization.WritingOptions.prettyPrinted da al consumidor final en un formato más fácil de leer si lo imprimieran en el depurador.

Referencia: documentación de Apple

La opción JSONSerialization.ReadingOptions.mutableContainers permite mutar los arreglos y / o diccionarios devueltos.

Referencia para todos los ReadingOptions: documentación de Apple

NOTA: Swift 4 tiene la capacidad de codificar y decodificar sus objetos utilizando un nuevo protocolo. Aquí está la documentación de las manzanas y un tutorial rápido para un ejemplo de inicio .

Si ya está usando SwiftyJSON:

https://github.com/SwiftyJSON/SwiftyJSON

Puedes hacerlo:

 // this works with dictionaries too let paramsDictionary = [ "title": "foo", "description": "bar" ] let paramsArray = [ "one", "two" ] let paramsJSON = JSON(paramsArray) let paramsString = paramsJSON.rawString(encoding: NSUTF8StringEncoding, options: nil) 

SWIFT 3 ACTUALIZACIÓN

  let paramsJSON = JSON(paramsArray) let paramsString = paramsJSON.rawString(String.Encoding.utf8, options: JSONSerialization.WritingOptions.prettyPrinted)! 

Las cadenas JSON, que son buenas para el transporte, no aparecen con frecuencia porque puedes codificar JSON en un cuerpo HTTP. Pero un posible caso de uso para JSON stringify es Multipart Post, que admite AlamoFire ahoras.

Cómo convertir array a json String en quick 2.3

 var yourString : String = "" do { if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(yourArray, options: NSJSONWritingOptions.PrettyPrinted) { yourString = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String } } catch { print(error) } 

Y ahora puedes usar tu cadena Sting como JSON.

SWIFT 2.0

 var tempJson : NSString = "" do { let arrJson = try NSJSONSerialization.dataWithJSONObject(arrInvitationList, options: NSJSONWritingOptions.PrettyPrinted) let string = NSString(data: arrJson, encoding: NSUTF8StringEncoding) tempJson = string! as NSString }catch let error as NSError{ print(error.description) } 

NOTA: – use la variable tempJson cuando quiera usar.

Sugerencia: Para convertir un NSArray que contiene objetos compatibles con JSON en un objeto NSData que contiene un documento JSON, utilice el método apropiado de NSJSONSerialization. JSONObjectWithData no es eso.

Sugerencia 2: rara vez quiere esos datos como una cadena; solo para fines de depuración.

Para Swift 3.0 debes usar esto:

 var postString = "" do { let data = try JSONSerialization.data(withJSONObject: self.arrayNParcel, options: .prettyPrinted) let string1:String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String postString = "arrayData=\(string1)&user_id=\(userId)&markupSrcReport=\(markup)" } catch { print(error.localizedDescription) } request.httpBody = postString.data(using: .utf8) 

100% trabajando PROBADO

Puedes probar esto.

 func convertToJSONString(value: AnyObject) -> String? { if JSONSerialization.isValidJSONObject(value) { do{ let data = try JSONSerialization.data(withJSONObject: value, options: []) if let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue) { return string as String } }catch{ } } return nil }