J'ai vraiment du mal à essayer de lire un fichier JSON dans Swift afin de pouvoir jouer avec. J'ai passé la majeure partie de 2 jours à rechercher et à essayer différentes méthodes, mais je n'ai pas encore de chance, je me suis donc inscrit à StackOverFlow pour voir si quelqu'un peut m'orienter dans la bonne direction .....
Mon fichier JSON s'appelle test.json et contient les éléments suivants:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
Le fichier est stocké directement dans les documents et j'y accède en utilisant le code suivant:
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 quelqu'un peut simplement me donner un coup de pouce dans la bonne direction sur la façon dont je peux désérialiser le fichier JSON et le placer dans un objet Swift accessible, je serai éternellement reconnaissant!
Sincères amitiés,
Krivvenz.
path
n'est visible que dans laif
portée et n'est pas résolu lorsque vous l'utilisez dansNSData(contentsOfFile, options, error)
; vous avez également des fautes de frappe dans les noms d'énumération.Réponses:
Suivez le code ci-dessous:
Le tableau "personnes" contiendra toutes les données pour la personne clé. Itérer à travers pour le récupérer.
Swift 4.0:
la source
Si quelqu'un cherche SwiftyJSON Réponse:
Mise à jour:
Pour
Swift 3/4
:la source
url(forResource
dans(NS)Bundle
pour éviter l'étape supplémentaire pour créer l'URLSwift 4 utilisant Decodable
Swift 3
la source
Xcode 8 Swift 3 lit json depuis la mise à jour du fichier:
la source
Noms mis à jour pour Swift 3.0
Sur la base de la réponse de Abhishek et la réponse de Druva
la source
Simplifier l'exemple fourni par Peter Kreinz. Fonctionne avec Swift 4.2.
La fonction d'extension:
Le modèle d'exemple:
L'exemple d'utilisation:
L'exemple fonctionnera également avec les tableaux:
Notez que nous ne fournissons pas de génériques inutiles, nous n'avons donc pas besoin de lancer le résultat de l'analyse.
la source
Réponse de Swift 2.1 (basée sur Abhishek):
la source
Production:
la source
Cela a très bien fonctionné avec moi
la source
Voici ma solution en utilisant SwiftyJSON
la source
👆🏻 Prêt à copier-coller, solution indépendante du cadre tiers.
utilisation 👇🏻
let json:[[String : AnyObject]] = loadJSON(name: "Stations")!
la source
Je fournis une autre réponse car aucune de celles-ci n'est destinée à charger la ressource à partir du bundle de test. Si vous consommez un service distant qui émet du JSON et que vous souhaitez effectuer un test unitaire en analysant les résultats sans atteindre le service réel, vous prenez une ou plusieurs réponses et les placez dans des fichiers dans le dossier Tests de votre projet.
Cela utilise également SwiftyJSON mais la logique de base pour obtenir le bundle de test et charger le fichier est la réponse à la question.
la source
Swift 4: Essayez ma solution:
la source
fromJSON
fonction d'extension lance, mais dans l'exemple que vous appelez sans letry
mot - clé. Ce code ne se compilera pas.fromJSON
vous utilisez une extension décodable, vous n'utilisez cependant aucune information du type décodable mais fournissez des génériques supplémentaires (complètement inutiles).La dernière swift 3.0 fonctionne parfaitement
la source
Swift 4
JSON
àClass
withDecodable
- pour ceux qui préfèrent les coursDéfinissez les classes comme suit:
Utilisation, assez abstraite:
Ceci permet à des méthodes pour les deux
People
et lesPerson
classes, les variables (attributs) et les méthodes peuvent également marquées commeprivate
si nécessaire.la source
Le code suivant fonctionne pour moi. J'utilise Swift 5
Ensuite, si votre structure de personne (ou classe) est décodable (et également toutes ses propriétés), vous pouvez simplement faire:
J'ai évité tout le code de gestion des erreurs pour le rendre plus lisible.
la source
Mis à jour pour Swift 3 avec le moyen le plus sûr
la source
Swift 5.1, Xcode 11
Vous pouvez utiliser ceci:
la source
D'après la réponse d'Abhishek , pour iOS 8, ce serait:
la source
Cela a fonctionné pour moi avec XCode 8.3.3
la source
Swift 4.1 Xcode 9.2 mis à jour
la source
NSData
dans Swift 3+, et.allowFragments
est inutile dans ce cas.la source
J'ai utilisé le code ci-dessous pour récupérer le JSON du fichier FAQ-data.json présent dans le répertoire du projet.
J'implémente dans Xcode 7.3 en utilisant Swift.
Structure du fichier JSON:
la source
Je pourrais également recommander le didacticiel Swift JSON de Ray Wenderlich (qui couvre également la superbe alternative SwiftyJSON, Gloss ). Un extrait (qui a accordé, en soi, ne répond pas entièrement à l'affiche, mais la valeur ajoutée de cette réponse est le lien, donc pas de -1 pour cela, s'il vous plaît):
Bien sûr, dans XCode 8.x, il vous suffit d'appuyer deux fois sur la barre d'espace et de dire "Hé, Siri, veuillez désérialiser ce JSON pour moi dans Swift 3.0 avec des espaces / tabulations".
la source
VERSION SWIFTYJSON SWIFT 3
la source
Créez d'abord un Struc codable comme ceci:
Déclarez maintenant la variable
Lire à partir du répertoire principal
Lire sur le Web
la source
Utilisez cette fonction générique
avec cette ligne de code:
pour ce type:
la source