J'ai un fichier JSON, je veux analyser et utiliser la liste des objets en vue tableau. Quelqu'un peut-il partager le code pour analyser le fichier JSON en swift.
Par exemple,let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
Caroline
4
Le problème avec cette approche est que vous vous retrouvez avec un tas d'objets de base. À savoir NSString, NSNumber, NSArray, NSDictionary ou NSNull. Ce qui crée un sacré fardeau de diffusion si vous souhaitez gérer Swift natif saisi plus tard dans votre code. Surtout si vous avez des dictionnaires et des tableaux imbriqués. Quelqu'un sait-il comment gérer cela?
@bubakazouba: Dommage que je ne puisse pas voter contre un commentaire. Deux choses: 1. Caroline a déjà fourni un extrait de code pour charger des données à partir d'un fichier (ce que OP voulait). 2. Votre code utilise le codage ASCII qui perd tous les symboles Unicode, y compris la prise en charge de la langue au-delà de l'anglais.
akashivskyy
43
Faire la demande d'API
var request:NSURLRequest=NSURLRequest(URL: url)var connection:NSURLConnection=NSURLConnection(request: request, delegate:self, startImmediately:false)
Préparer la réponse
Déclarez un tableau comme ci-dessous
var data:NSMutableData=NSMutableData()
Recevoir la réponse
1.
func connection(didReceiveResponse:NSURLConnection!, didReceiveResponse response:NSURLResponse!){// Received a new request, clear out the data object
self.data =NSMutableData()}
2.
func connection(connection:NSURLConnection!, didReceiveData data:NSData!){// Append the received chunk of data to our data object
self.data.appendData(data)}
3.
func connectionDidFinishLoading(connection:NSURLConnection!){// Request complete, self.data should now hold the resulting info
// Convert the retrieved data in to an object through JSON deserialization
var err:NSErrorvar jsonResult:NSDictionary=NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error:nil)asNSDictionaryif jsonResult.count>0&& jsonResult["results"].count>0{var results:NSArray= jsonResult["results"]asNSArrayself.tableData = results
self.appsTableView.reloadData()}}
Lorsque NSURLConnectionnous recevons une réponse, nous pouvons nous attendre à ce que la didReceiveResponseméthode soit appelée en notre nom. À ce stade, nous réinitialisons simplement nos données en disant self.data = NSMutableData(), créant un nouvel objet de données vide.
Une fois la connexion établie, nous commencerons à recevoir des données dans la méthode didReceiveData. L'argument de données passé ici est la provenance de toutes nos informations juteuses. Nous devons nous accrocher à chaque morceau qui entre, donc nous l'ajoutons à l'objet self.data que nous avons effacé plus tôt.
Enfin, lorsque la connexion est établie et que toutes les données ont été reçues, connectionDidFinishLoadingest appelée et nous sommes prêts à utiliser les données dans notre application. Hourra!
La connectionDidFinishLoadingméthode ici utilise la NSJSONSerializationclasse pour convertir nos données brutes en Dictionaryobjets utiles en désérialisant les résultats de votre URL.
let myjson =MyJSON(obj)
myjson.object.null
myjson.object.bool
myjson.object.int
myjson.object.double
myjson.object.string
//...
J'espère que vous aimez.
Avec le nouveau xCode 7.3+, il est important d'ajouter votre domaine à la liste d'exceptions ( Comment puis-je ajouter NSAppTransportSecurity à mon fichier info.plist? ), Reportez-vous à cette publication pour obtenir des instructions, sinon vous obtiendrez une erreur d'autorité de transport.
Une question concernant votre dépôt Github: comment exécutez-vous réellement le main.swift? J'ai du mal à l'exécuter depuis le terrain de jeu car vous ne semblez pas faire référence aux classes définies dans votre propre projet depuis le terrain de jeu (?!) Merci!
Janos
J'ai marqué les méthodes comme publiques dans le dernier repo. Cela rend la configuration minimale requise pour Beta4, alors n'oubliez pas de mettre à jour Xcode avant d'essayer
dankogai
Ok merci, je cherchais vraiment comment exécuter exactement l'exemple de code. J'ai essayé playgroung mais cela n'a pas fonctionné car je n'ai pas pu faire référence à la classe JSON (c'est un problème connu que vous ne pouvez pas faire référence aux classes de votre projet)
Janos
Je ne peux pas le faire fonctionner: (Cette fois, je n'essaye pas de l'utiliser dans la cour de récréation, j'ai ajouté votre json.swift à mon projet et dans une autre classe j'essaye de l'utiliser. Cela ne fonctionne pas. J'ai essayé le JSON le plus simple: {"id": "Janos"}, j'ai créé l'objet JSON, appelé sa méthode toString, il crache correctement le contenu du fichier, mais quand j'appelle myJson ["id"]. AsString, j'obtiens nil. Qu'est-ce que je manque?
Janos
J'essayais de construire un objet JSON en passant une chaîne dans le constructeur ... J'ai changé la façon dont vous faites dans l'exemple maintenant cela fonctionne un régal. La seule question est de savoir lequel utiliser maintenant, le vôtre ou SwiftyJSon :)
Janos
4
Voici un code pour effectuer les conversions entre JSON et NSData dans Swift 2.0
// Convert from NSData to json object
func nsdataToJSON(data:NSData)->AnyObject?{do{returntryNSJSONSerialization.JSONObjectWithData(data, options:.MutableContainers)}catchlet myJSONError {
print(myJSONError)}returnnil}// Convert from JSON to nsdata
func jsonToNSData(json:AnyObject)->NSData?{do{returntryNSJSONSerialization.dataWithJSONObject(json, options:NSJSONWritingOptions.PrettyPrinted)}catchlet myJSONError {
print(myJSONError)}returnnil;}
Dans Swift 4+, il est fortement recommandé d'utiliser à la Codableplace de JSONSerialization.
Cela Codablecomprend deux protocoles: Decodableet Encodable. Ce Decodableprotocole vous permet de décoder Dataau format JSON en structure / classe personnalisée conforme à ce protocole.
Par exemple imaginez la situation que nous avons ce simple Data(tableau de deux objets)
let data =Data("""
[
{"name":"Steve","age":56},
{"name":"iPhone","age":11}
]
""".utf8)
Ensuite, suivez structet implémentez le protocoleDecodable
maintenant vous pouvez décoder votre Datadans votre tableau d' Personutilisation JSONDecoderoù le premier paramètre est de type conforme Decodableet à ce type doit Dataêtre décodé
do{let people =tryJSONDecoder().decode([Person].self, from: data)}catch{ print(error)}
... notez que le décodage doit être marqué avec un trymot-clé car vous pourriez par exemple faire une erreur avec le nom et ensuite votre modèle ne peut pas être décodé correctement ... vous devriez donc le mettre dans le bloc do-try-catch
Les cas dont la clé dans json est différent du nom de la propriété:
Si la clé est nommée à l'aide de snake_case, vous pouvez définir le décodeur keyDecodingStrategyvers convertFromSnakeCaselequel change la clé de property_nameà camelCasepropertyName
let decoder =JSONDecoder()
decoder.keyDecodingStrategy =.convertFromSnakeCase
let people =try decoder.decode([Person].self, from: data)
Si vous avez besoin d'un nom unique, vous pouvez utiliser des clés de codage à l' intérieur de struct / class où vous déclarez le nom de la clé
let data =Data("""
{ "userName":"Codable", "age": 1 }
""".utf8)structPerson:Decodable{let name:Stringlet age:IntenumCodingKeys:String,CodingKey{case name ="userName"case age
}}
J'ai également écrit une petite bibliothèque spécialisée pour le mappage de la réponse json dans une structure d'objet. J'utilise en interne la bibliothèque json-swift de David Owens. Peut-être que c'est utile pour quelqu'un d'autre.
Ensuite, pour mapper réellement les objets de la réponse JSON, il vous suffit de transmettre les données dans la classe EmployeeContainer en tant que paramètre dans le constructeur. Il crée automatiquement votre modèle de données.
var baseWebservice:BaseWebservice=BaseWebservice();var urlToJSON ="http://prine.ch/employees.json"var callbackJSON ={(status:Int, employeeContainer:EmployeeContainer)->()infor employee in employeeContainer.employees {
println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")}}
baseWebservice.get(urlToJSON, callback:callbackJSON)
La sortie de la console ressemble alors à ce qui suit:
Pardonne mon ignorance. Quels sont les avantages d'utiliser votre bibliothèque par rapport à une bibliothèque comme SwiftyJSON?
Levi Roberts
6
Au départ, j'ai construit cela parce que je n'aimais pas l'idée des opérateurs / symboles de piratage de langage. De plus, je l'ai construit pour me familiariser avec Swift. Par curiosité, j'ai exécuté un benchmark et j'ai trouvé que SwiftyJSON avait une vitesse supérieure (~ 2 à 7 fois plus rapide). J'ai mis à jour le fichier README du repo pour l'admettre.
Mike Rapadas
Merci pour votre réponse.
Levi Roberts
Pouvez-vous montrer un exemple de la façon dont vous chargeriez un tableau de données à partir du JSON (plusieurs éléments essentiellement avec une boucle, etc.)
Joseph Astrahan
2
L'analyse JSON dans Swift est un excellent travail pour la génération de code. J'ai créé un outil sur http://www.guideluxe.com/JsonToSwift pour faire exactement cela.
Vous fournissez un exemple d'objet JSON avec un nom de classe et l'outil générera une classe Swift correspondante, ainsi que toutes les classes Swift subsidiaires nécessaires, pour représenter la structure impliquée par l'exemple JSON. Sont également incluses les méthodes de classe utilisées pour remplir les objets Swift, y compris celle qui utilise la méthode NSJSONSerialization.JSONObjectWithData. Les mappages nécessaires des objets NSArray et NSDictionary sont fournis.
À partir du code généré, il vous suffit de fournir un objet NSData contenant JSON qui correspond à l'exemple fourni à l'outil.
À part Foundation, il n'y a pas de dépendances.
Mon travail a été inspiré par http://json2csharp.com/ , qui est très pratique pour les projets .NET.
Voici comment créer un objet NSData à partir d'un fichier JSON.
let fileUrl: NSURL =NSBundle.mainBundle().URLForResource("JsonFile", withExtension:"json")!let jsonData:NSData=NSData(contentsOfURL: fileUrl)!
Désolé, je collais directement l'URL JSON, cela fonctionne bien en collant la réponse JSON. Ce serait fabuleux d'avoir une URL directement collée. Mais travail brillant pour cet utilitaire. Merci.
ioopl
L'outil que vous avez créé est tout simplement génial. J'utilise cet outil depuis 6 mois. Mais soudainement, depuis les 3 derniers jours, votre site Web n'est pas accessible et le navigateur répond avec "Ce site ne peut pas être atteint" ce message. Alors, quelle est la raison derrière cela?
let parsedResult:[String:AnyObject]do{
parsedResult =tryJSONSerialization.jsonObject(with: data, options:.allowFragments)as![String:AnyObject]}catch{// Display an error or return or whatever
}
data - c'est le type de données (structure) (c'est-à-dire retourné par une réponse du serveur)
Réponses:
Rien de plus simple:
Cela étant dit, je recommande fortement d'utiliser les API codables introduites dans Swift 4.
la source
let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
NSData(contentsOfFile: path)
. Voir developer.apple.com/library/ios/documentation/Cocoa/Reference/… :Faire la demande d'API
Préparer la réponse
Déclarez un tableau comme ci-dessous
Recevoir la réponse
1.
2.
3.
Lorsque
NSURLConnection
nous recevons une réponse, nous pouvons nous attendre à ce que ladidReceiveResponse
méthode soit appelée en notre nom. À ce stade, nous réinitialisons simplement nos données en disantself.data = NSMutableData()
, créant un nouvel objet de données vide.Une fois la connexion établie, nous commencerons à recevoir des données dans la méthode
didReceiveData
. L'argument de données passé ici est la provenance de toutes nos informations juteuses. Nous devons nous accrocher à chaque morceau qui entre, donc nous l'ajoutons à l'objet self.data que nous avons effacé plus tôt.Enfin, lorsque la connexion est établie et que toutes les données ont été reçues,
connectionDidFinishLoading
est appelée et nous sommes prêts à utiliser les données dans notre application. Hourra!La
connectionDidFinishLoading
méthode ici utilise laNSJSONSerialization
classe pour convertir nos données brutes enDictionary
objets utiles en désérialisant les résultats de votre URL.la source
Je viens d'écrire une classe appelée JSON, ce qui rend la gestion JSON dans Swift aussi simple que l'objet JSON dans ES5.
Transformez votre objet Swift en JSON comme ceci:
... ou chaîne ...
... ou URL.
Traversez simplement les éléments via un indice:
Tout comme SwiftyJSON, vous ne vous inquiétez pas si l'entrée en indice n'existe pas.
Si vous êtes fatigué des indices, ajoutez votre schéma comme ceci:
Et vous allez:
J'espère que vous aimez.
Avec le nouveau xCode 7.3+, il est important d'ajouter votre domaine à la liste d'exceptions ( Comment puis-je ajouter NSAppTransportSecurity à mon fichier info.plist? ), Reportez-vous à cette publication pour obtenir des instructions, sinon vous obtiendrez une erreur d'autorité de transport.
la source
Voici un code pour effectuer les conversions entre JSON et NSData dans Swift 2.0
la source
Codable
Dans Swift 4+, il est fortement recommandé d'utiliser à la
Codable
place deJSONSerialization
.Cela
Codable
comprend deux protocoles:Decodable
etEncodable
. CeDecodable
protocole vous permet de décoderData
au format JSON en structure / classe personnalisée conforme à ce protocole.Par exemple imaginez la situation que nous avons ce simple
Data
(tableau de deux objets)Ensuite, suivez
struct
et implémentez le protocoleDecodable
maintenant vous pouvez décoder votre
Data
dans votre tableau d'Person
utilisationJSONDecoder
où le premier paramètre est de type conformeDecodable
et à ce type doitData
être décodé... notez que le décodage doit être marqué avec un
try
mot-clé car vous pourriez par exemple faire une erreur avec le nom et ensuite votre modèle ne peut pas être décodé correctement ... vous devriez donc le mettre dans le bloc do-try-catchLes cas dont la clé dans json est différent du nom de la propriété:
Si la clé est nommée à l'aide de snake_case, vous pouvez définir le décodeur
keyDecodingStrategy
versconvertFromSnakeCase
lequel change la clé deproperty_name
à camelCasepropertyName
Si vous avez besoin d'un nom unique, vous pouvez utiliser des clés de codage à l' intérieur de struct / class où vous déclarez le nom de la clé
la source
J'ai également écrit une petite bibliothèque spécialisée pour le mappage de la réponse json dans une structure d'objet. J'utilise en interne la bibliothèque json-swift de David Owens. Peut-être que c'est utile pour quelqu'un d'autre.
https://github.com/prine/ROJSONParser
Exemple Employees.json
À l'étape suivante, vous devez créer votre modèle de données (EmplyoeeContainer et Employee).
Employé.swift
EmployeeContainer.swift
Ensuite, pour mapper réellement les objets de la réponse JSON, il vous suffit de transmettre les données dans la classe EmployeeContainer en tant que paramètre dans le constructeur. Il crée automatiquement votre modèle de données.
La sortie de la console ressemble alors à ce qui suit:
la source
SwiftJSONParse : analyser JSON comme un badass
Mort-simple et facile à lire!
Exemple: obtenir la valeur
"mrap"
de ennicknames
tant que chaîne de cette réponse JSONIl prend vos données json telles quelles
NSData
, pas besoin de prétraiter.Avertissement: j'ai fait ceci et j'espère que cela aidera tout le monde. N'hésitez pas à l'améliorer!
la source
L'analyse JSON dans Swift est un excellent travail pour la génération de code. J'ai créé un outil sur http://www.guideluxe.com/JsonToSwift pour faire exactement cela.
Vous fournissez un exemple d'objet JSON avec un nom de classe et l'outil générera une classe Swift correspondante, ainsi que toutes les classes Swift subsidiaires nécessaires, pour représenter la structure impliquée par l'exemple JSON. Sont également incluses les méthodes de classe utilisées pour remplir les objets Swift, y compris celle qui utilise la méthode NSJSONSerialization.JSONObjectWithData. Les mappages nécessaires des objets NSArray et NSDictionary sont fournis.
À partir du code généré, il vous suffit de fournir un objet NSData contenant JSON qui correspond à l'exemple fourni à l'outil.
À part Foundation, il n'y a pas de dépendances.
Mon travail a été inspiré par http://json2csharp.com/ , qui est très pratique pour les projets .NET.
Voici comment créer un objet NSData à partir d'un fichier JSON.
la source
Remarque: si vous recherchez ceci, il y a aussi de fortes chances que vous ne sachiez pas comment installer
swifty
. Suivez les instructions ici .Entrez ensuite cette commande:
Cela créera une valeur
Podfile
par défaut pour votre projet. C'estPodfile
là que vous définissez les dépendances sur lesquelles repose votre projet.Tapez cette commande pour ouvrir en
Podfile
utilisantXcode
pour l'édition:Ajouter le
Swifty
dans le fichier podla source
Le viewcontroller entier qui affiche les données dans la vue de collecte en utilisant deux méthodes de json parsig
la source
Utilisation du framework ObjectMapper
Avant de préparer l'ensemble des objets: Mappable appropriés à analyser
la source
Swift 3
data - c'est le type de données (structure) (c'est-à-dire retourné par une réponse du serveur)
la source
Cet analyseur utilise des génériques pour convertir JSON en types Swift, ce qui réduit le code à taper.
https://github.com/evgenyneu/JsonSwiftson
la source
Voici un exemple de Swift Playground:
la source
Swift 4
Créer un projet
Design StoryBoard avec un bouton et un UITableview
Créer TableViewCell VC
Dans Action du bouton, insérez les codes suivants
Souvenez-vous de ce code pour récupérer un tableau de données dans une API
Ceci est pour la récupération des données du dictionnaire
la source
Exemple de demande d'API Swift 4
Se servir de
JSONDecoder().decode
Voir cette vidéo Analyse JSON avec Swift 4
la source
Swift 2 iOS 9
la source