swiftyjson parse example swift swifty-json

parse - Las mejores prácticas para averiguar si el diccionario SwiftyJSON tiene clave



swiftyjson local json file (6)

La latest versión de SwiftyJSON tiene la función de exists() .

NOTA : Su documentación más reciente no refleja muy bien el código ... El método real es que exists()

// Returns boolean json["name"].exists()

Estoy tratando de encontrar una manera de obtener el valor de una clave en un diccionario SwiftyJSON y devolver una cadena predeterminada, si la clave no está establecida. El siguiente ejemplo funciona bien, pero no estoy realmente satisfecho. ¿Conoces una forma más elegante?

Ejemplo:

let users: JSON = [ ["id": 1, "name": "one"], ["id": 2], ["id": 3, "name": "three"] ] for (key: String, user: JSON) in users { println(user.object.objectForKey("name") != nil ? user["name"].stringValue : "default") }


Los objetos de tipo JSON tienen una propiedad calculada llamada null . Esto devuelve NSNull si el elemento solicitado no existe, nil si lo hace. Por lo tanto, puede probar la existencia de un objeto específico extrayéndolo de su JSON principal y comprobando si existe la propiedad null . Yo personalmente lo manejo así:

let object = json["key"] if object.null == nil { // Do something with ''object'' } else { // Key does not exist - handle the error }

En tu caso específico, podrías usar esto:

for (key: String, user: JSON) in users { let name = user.object.objectForKey("name") println(name.null == nil ? name.stringValue : "default") }

... pero como sabemos que estamos buscando una cuerda, podemos cortarla aún más. Todo lo que necesitas hacer es eliminar la parte ''Valor'' de stringValue , ya que la string devolverá nulo si no puede generar una cadena a partir de su contenido. Además, echa un vistazo al operador de coalescencia nula ?? . Está diseñado para proporcionar un valor predeterminado para las variables opcionales, así que intente esto:

for (key: String, user: JSON) in users { println(user["name"].string ?? "default") }

Agradable y compacto!


Parece que SwiftyJSON establece la propiedad de error cuando el subscript no existe clave.

Entonces, esto debería funcionar:

for (key: String, user: JSON) in users { let name = user["name"]; println(name.error == nil ? name.stringValue : "default") }

Por ejemplo: w / Versión 6.1.1 (6A2006), SwiftyJSON github master actual:

let users: JSON = [ ["id": 1, "name": "one"], ["id": 2], ["id": 3, "name": NSNull()], ["id": 4, "name": "four"], ] for (key: String, user: JSON) in users { let name = user["name"]; name.isEmpty println(name.error == nil ? name.stringValue : "default") }

huellas dactilares:

one default four


Por lo que puedo decir, esto funciona:

let users: JSON = [ ["id": 1, "name": "one"], ["id": 2], ["id": 3, "name": "three"] ] for jsonDict in users.arrayValue { println(jsonDict["name"].string ?? "default") }

Para explicar, desea convertir el objeto JSON a los tipos que espera obtener. Si desea que el tipo siempre tenga éxito (no es opcional), use xxxValue . Por lo tanto, lanzamos el objeto raíz usando arrayValue .

arrayValue devuelve [JSON] , que recorremos en el bucle. No necesitamos jsonDict: JSON el jsonDict: JSON para objetar, ya que SwiftyJSON es lo suficientemente inteligente como para suponer que es un dictado de los operadores de subíndices.

Finalmente, intente obtener una clave del dict, luego verifique si la clave se puede recuperar como una cadena usando .string , que es opcional. Utilice la unión nula para asignar un valor predeterminado.

Por favor vea el documento SwiftJSON para string y stringValue


Si necesita comprobar si un diccionario SwiftyJSON tiene una clave, puede compararla con JSON.null .

user["name"] == JSON.null // true if the key does not exist

Usando ese método, su código podría verse así:

let users: JSON = [ ["id": 1, "name": "one"], ["id": 2], ["id": 3, "name": "three"] ] for (key, user) in users { print(user["name"] != JSON.null ? user["name"].stringValue : "default") }

Si solo desea proporcionar un valor predeterminado, puede usar el Operador de fusión nula en Swift ( ?? ) de la siguiente manera:

let users: JSON = [ ["id": 1, "name": "one"], ["id": 2], ["id": 3, "name": "three"] ] for (key, user) in users { print(user["name"].string ?? "default") }

SwiftJSON proporciona el método de string , que devuelve un valor opcional ( String? ), Contrariamente a stringValue que siempre devuelve una String .


Nota: Esta respuesta ya no es válida.

Parece que el uso perfecto de if let sintaxis. Debido a que acceder al subíndice devolverá un opcional, vincúlelo a una variable en un bloque if let . Esto le dirá si la clave estaba en el JSON .

if let name = user["name"] { // returns optional // user["name"] was non-nil, is now stored in ``name"" // do something with ``name"" } else { // user did not have key "name" // here would be the place to return "default" // or do any other error correction if the key did not exist }