Converter dictionary em JSON no Swift

Eu criei o próximo dictionary:

var postJSON = [ids[0]:answersArray[0], ids[1]:answersArray[1], ids[2]:answersArray[2]] as Dictionary 

e eu recebo:

 [2: B, 1: A, 3: C] 

Então, como posso convertê-lo em JSON?

Swift 3.0

Com o Swift 3, o nome da NSJSONSerialization e seus methods foram alterados, de acordo com as Diretrizes de Design da API do Swift .

 let dic = ["2": "B", "1": "A", "3": "C"] do { let jsonData = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted) // here "jsonData" is the dictionary encoded in JSON data let decoded = try JSONSerialization.jsonObject(with: jsonData, options: []) // here "decoded" is of type `Any`, decoded from JSON data // you can now cast it with the right type if let dictFromJSON = decoded as? [String:String] { // use dictFromJSON } } catch { print(error.localizedDescription) } 

Swift 2.x

 do { let jsonData = try NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted) // here "jsonData" is the dictionary encoded in JSON data let decoded = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) // here "decoded" is of type `AnyObject`, decoded from JSON data // you can now cast it with the right type if let dictFromJSON = decoded as? [String:String] { // use dictFromJSON } } catch let error as NSError { print(error) } 

Swift 1

 var error: NSError? if let jsonData = NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted, error: &error) { if error != nil { println(error) } else { // here "jsonData" is the dictionary encoded in JSON data } } if let decoded = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as? [String:String] { if error != nil { println(error) } else { // here "decoded" is the dictionary decoded from JSON data } } 

Você está fazendo uma suposição errada. Só porque o depurador / Playground mostra seu dictionary entre colchetes (que é como o Cocoa exibe os dictionarys) isso não significa que é a forma como a saída JSON é formatada.

Aqui está um código de exemplo que irá converter um dictionary de strings para JSON:

Versão Swift 3:

 import Foundation let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"] if let theJSONData = try? JSONSerialization.data( withJSONObject: dictionary, options: []) { let theJSONText = String(data: theJSONData, encoding: .ascii) print("JSON string = \(theJSONText!)") } 

Para exibir o acima no formato “bem impresso”, você alteraria a linha de opções para:

  options: [.prettyPrinted] 

Ou na syntax do Swift 2:

 import Foundation let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"] let theJSONData = NSJSONSerialization.dataWithJSONObject( dictionary , options: NSJSONWritingOptions(0), error: nil) let theJSONText = NSString(data: theJSONData!, encoding: NSASCIIStringEncoding) println("JSON string = \(theJSONText!)") 

A saída disso é

 "JSON string = {"anotherKey":"anotherValue","aKey":"aValue"}" 

Ou no formato bonito:

 { "anotherKey" : "anotherValue", "aKey" : "aValue" } 

O dictionary é colocado entre chaves na saída JSON, exatamente como você esperaria.

EDITAR:

Na syntax do Swift 3/4, o código acima se parece com isto:

  let dictionary = ["aKey": "aValue", "anotherKey": "anotherValue"] if let theJSONData = try? JSONSerialization.data( withJSONObject: dictionary, options: .prettyPrinted ), let theJSONText = String(data: theJSONData, encoding: String.Encoding.ascii) { print("JSON string = \n\(theJSONText)") } } 

Minha resposta para sua pergunta está abaixo

 let dict = ["0": "ArrayObjectOne", "1": "ArrayObjecttwo", "2": "ArrayObjectThree"] var error : NSError? let jsonData = try! NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted) let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)! as String print(jsonString) 

A resposta é

 { "0" : "ArrayObjectOne", "1" : "ArrayObjecttwo", "2" : "ArrayObjectThree" } 

Às vezes é necessário imprimir a resposta do servidor para fins de debugging. Aqui está uma function que eu uso:

 extension Dictionary { var json: String { let invalidJson = "Not a valid JSON" do { let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) return String(bytes: jsonData, encoding: String.Encoding.utf8) ?? invalidJson } catch { return invalidJson } } func printJson() { print(json) } } 

Exemplo de uso:

 (lldb) po dictionary.printJson() { "InviteId" : 2, "EventId" : 13591, "Messages" : [ { "SenderUserId" : 9514, "MessageText" : "test", "RecipientUserId" : 9470 }, { "SenderUserId" : 9514, "MessageText" : "test", "RecipientUserId" : 9470 } ], "TargetUserId" : 9470, "InvitedUsers" : [ 9470 ], "InvitingUserId" : 9514, "WillGo" : true, "DateCreated" : "2016-08-24 14:01:08 +00:00" } 

Swift 4:

 let dic = ["2": "B", "1": "A", "3": "C"] let encoder = JSONEncoder() if let jsonData = try? encoder.encode(dic) { if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) } } 

Observe que chaves e valores devem implementar Codable . Strings, Ints e Doubles (e mais) já são Codable . Veja Codificação e Decodificação de Tipos Personalizados .

Swift 3 :

 let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []) let jsonString = String(data: jsonData!, encoding: .utf8)! print(jsonString) 

Resposta para a sua pergunta é abaixo:

Swift 2.1

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

Aqui está uma extensão fácil para fazer isso:

https://gist.github.com/stevenojo/0cb8afcba721838b8dcb115b846727c3

 extension Dictionary { func jsonString() -> NSString? { let jsonData = try? JSONSerialization.data(withJSONObject: self, options: []) guard jsonData != nil else {return nil} let jsonString = String(data: jsonData!, encoding: .utf8) guard jsonString != nil else {return nil} return jsonString! as NSString } }