objeto libreria leer instalar example escribir ejemplo dumps dinamico diccionario crear convertir json swift dictionary swift2

libreria - ¿Cómo convertir una matriz de diccionario a JSON?



leer y escribir json python (3)

Tengo una variedad de diccionarios que me gustaría convertir a JSON. Mi objeto es de tipo [[String: AnyObject]] y me gustaría terminar con una muestra como esta:

[ { "abc": 123, "def": "ggg", "xyz": true }, { "abc": 456, "def": "hhh", "xyz": false }, { "abc": 789, "def": "jjj", "xyz": true } ]

Esto es lo que intento, pero al compilador no le está gustando mi declaración:

extension Array where Element == Dictionary<String, AnyObject> { var json: String { do { return try? NSJSONSerialization.dataWithJSONObject(self, options: []) ?? "[]" } catch { return "[]" } } }

¿Cómo puedo hacer esto?


Creo que no está de suerte tratando de extender Array , porque los requisitos del mismo tipo no son posibles al extender una entidad.

Lo que puedes hacer es hacer uso de funciones gratuitas:

func jsonify(array: [[String:AnyObject]]) { ... }

De esta forma, mantendrá el tipo de seguridad que desea, con el gasto de mover la ubicación de la función.


Una forma simple de lograr eso es simplemente extender CollectionType.

Utilice el enlace y downcasting opcionales, luego serialice los datos, luego conviértelos en string.

extension CollectionType where Generator.Element == [String:AnyObject] { func toJSONString(options: NSJSONWritingOptions = .PrettyPrinted) -> String { if let arr = self as? [[String:AnyObject]], let dat = try? NSJSONSerialization.dataWithJSONObject(arr, options: options), let str = String(data: dat, encoding: NSUTF8StringEncoding) { return str } return "[]" } } let arrayOfDictionaries: [[String:AnyObject]] = [ ["abc":123, "def": "ggg", "xyz": true], ["abc":456, "def": "hhh", "xyz": false] ] print(arrayOfDictionaries.toJSONString())

Salida:

[ { "abc" : 123, "def" : "ggg", "xyz" : true }, { "abc" : 456, "def" : "hhh", "xyz" : false } ]


Swift 4 :

extension Collection where Iterator.Element == [String:AnyObject] { func toJSONString(options: JSONSerialization.WritingOptions = .prettyPrinted) -> String { if let arr = self as? [[String:AnyObject]], let dat = try? JSONSerialization.data(withJSONObject: arr, options: options), let str = String(data: dat, encoding: String.Encoding.utf8) { return str } return "[]" } }

Uso:

let arrayOfDictionaries = [ { "abc": 123, "def": "ggg", "xyz": true }, { "abc": 456, "def": "hhh", "xyz": false }, { "abc": 789, "def": "jjj", "xyz": true } ] print(arrayOfDictionaries.toJSONString())