Realmente estoy luchando por tratar de leer un archivo JSON en Swift para poder jugar con él. He pasado la mayor parte de 2 días volviendo a buscar y probando diferentes métodos, pero todavía no he tenido suerte, así que me he registrado en StackOverFlow para ver si alguien puede señalarme en la dirección correcta .....
Mi archivo JSON se llama test.json y contiene lo siguiente:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
El archivo se almacena en los documentos directamente y accedo usando el siguiente código:
let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
NSSearchpathDirectory.DocumentDirectory,
NSSearchPathDomainMask.AllDomainMask,
true) as String[]
if (dirs != nil) {
let directories: String[] = dirs
let dir = directories[0]
let path = dir.stringByAppendingPathComponent(file)
}
var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.
var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary
println("jsonDict \(jsonDict)") - This prints nil.....
Si alguien puede darme un empujón en la dirección correcta sobre cómo puedo deserializar el archivo JSON y ponerlo en un objeto Swift accesible, ¡estaré eternamente agradecido!
Saludos cordiales,
Krivvenz
path
solo es visible en suif
alcance y no está resuelto cuando lo usaNSData(contentsOfFile, options, error)
; También tiene errores tipográficos en los nombres de enumeración.Respuestas:
Sigue el siguiente código:
La matriz "personas" contendrá todos los datos de la persona clave. Iterar a través para buscarlo.
Swift 4.0:
fuente
Si alguien está buscando SwiftyJSON Respuesta:
Actualización:
Para
Swift 3/4
:fuente
url(forResource
de(NS)Bundle
evitar el paso adicional para crear la URLSwift 4 usando Decodable
Swift 3
fuente
Xcode 8 Swift 3 lee json de la actualización del archivo:
fuente
Nombres actualizados para Swift 3.0
Sobre la base de la respuesta de Abhishek y la respuesta de Druva
fuente
Simplificando el ejemplo proporcionado por Peter Kreinz. Funciona con Swift 4.2.
La función de extensión:
El modelo de ejemplo:
El ejemplo de uso:
El ejemplo también funcionará con matrices:
Observe cómo no proporcionamos genéricos innecesarios, por lo tanto, no necesitamos emitir el resultado del análisis.
fuente
Respuesta rápida de 2.1 (basada en la de Abhishek):
fuente
Salida:
fuente
Esto funcionó muy bien conmigo
fuente
Aquí está mi solución usando SwiftyJSON
fuente
👆🏻 listo para copiar y pegar, solución independiente de marco de terceros.
uso 👇🏻
let json:[[String : AnyObject]] = loadJSON(name: "Stations")!
fuente
Estoy proporcionando otra respuesta porque ninguno de los que están aquí están orientados a cargar el recurso desde el paquete de prueba. Si está consumiendo un servicio remoto que emite JSON y desea realizar una prueba unitaria analizando los resultados sin acceder al servicio real, debe tomar una o más respuestas y colocarlas en archivos en la carpeta Pruebas de su proyecto.
Esto también usa SwiftyJSON, pero la lógica central de obtener el paquete de prueba y cargar el archivo es la respuesta a la pregunta.
fuente
Swift 4: prueba mi solución:
fuente
fromJSON
Lanza su función de extensión, pero en el ejemplo lo llama sin latry
palabra clave. Este código no se compilará.fromJSON
si utiliza una extensión Decodable, no utiliza ninguna información del tipo Decodable, sino que proporciona genéricos adicionales (completamente inútiles).El último swift 3.0 funciona absolutamente
fuente
Swift 4
JSON
toClass
withDecodable
- para aquellos que prefieren las clasesDefina las clases de la siguiente manera:
Uso, bastante abstracto:
Esto permite que los métodos para tanto
People
yPerson
clases, variables (atributos) y métodos también se marca comoprivate
si fuera necesario.fuente
El siguiente código me funciona. Estoy usando Swift 5
Luego, si su estructura de persona (o clase) es decodificable (y también todas sus propiedades), simplemente puede hacer:
Evité todo el código de manejo de errores para que el código sea más legible.
fuente
Actualizado para Swift 3 con la forma más segura
fuente
Swift 5.1, Xcode 11
Puedes usar esto:
fuente
Según la respuesta de Abhishek , para iOS 8 esto sería:
fuente
Esto funcionó para mí con XCode 8.3.3
fuente
Swift 4.1 actualizado Xcode 9.2
fuente
NSData
en Swift 3+, y no.allowFragments
tiene sentido en este caso.fuente
He usado el siguiente código para obtener JSON del archivo FAQ-data.json presente en el directorio del proyecto.
Estoy implementando en Xcode 7.3 usando Swift.
Estructura del archivo JSON:
fuente
También podría recomendar el Tutorial Swift JSON de Ray Wenderlich (que también cubre la increíble alternativa SwiftyJSON, Gloss ). Un extracto (que, por sí solo, no responde completamente al póster, pero el valor agregado de esta respuesta es el enlace, por lo que no hay -1 para eso, por favor):
Por supuesto, en XCode 8.x, solo toca dos veces la barra espaciadora y dice "Hola, Siri, deserialice este JSON para mí en Swift 3.0 con espacios / tabulaciones".
fuente
SWIFTYJSON VERSIÓN SWIFT 3
fuente
Primero cree un Struc codificable como este:
Ahora declara la variable
Leer desde el directorio principal
Leer desde la web
fuente
Usa esta función genérica
con esta línea de código:
para este tipo:
fuente