Lire un fichier json
helio
Membre
Bonjour,
Je dois lire un fichier json qui a la forme suivante :
{"champ 1":"test 1", "champ 2":"test 2", "entete":["valeur 1", "valeur 2"], "donnees":[[0, True], [1, True], [0, False]], "champ 3":"test 3"}
J'arrive bien à récupérer test 1, test 2, test 3
Approximativement voici mon code :
struct ResponseData: Decodable {
let champ1: String
let champ2: String
let champ3: String
}
func loadJson(fileName: String) -> ResponseData? {
if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let jsonData = try decoder.decode(ResponseData.self, from: data)
return jsonData
} catch {
print("error:\(error)")
}
}
return nil
}
guard let result = loadJson(fileName: "File")
else { return }
print(result.champ1)
print(result.champ2)
print(result.champ3)
Cependant comment récupérer les valeurs entre crochets [0, True] etc...
Merci de votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Alors plusieurs choses m'embêtent.
Tu devrais avoir des erreurs de thrown, non ?
Les noms des variables
champ1
,champ2
etchamp3
ne correspondent exactement au noms des cléschamp 1
(y'a un espace), donc il faut rajouter une ligne pour dire à quelle clés en String cela correspond réellement.Ensuite,
["valeur 1", "valeur 2"]
, clairement, ça c'est un Array. Donc:let entente: [String]
devrait faire l'affaire.Pour
données
, c'est du[Any]
ou du[Bool]
, ou du [Int
, puisBool
], donc là, y'aura un peu plus de travail.Ça dépend de ce que tu veux et de ce que cela représente réellement.
Franchement ne t'embête pas à générer ça toi même.
Utilise cet outil, il y a aussi une extension pour Xcode si besoin.
Edit : par contre fais attention qu'en JSON
true
etfalse
ne prennent pas de majuscule.Merci !
ah oui génial ton outil ! impressionnant !
ça fonctionne, mais en revanche comment ça récupère toutes les infos "donnees":[[0, True], [1, True], [0, False]]
je ne vois pas de boucle !
C'est parce que la struct se conforme au protocole Codable. C'est le compilateur qui génère automatiquement le code. Cherche sur le web, il y a quelques articles qui expliquent cela fort bien, ainsi que les limites de ce mécanisme, notamment quand les noms des champs de la struct ne correspondent pas aux clés du JSON.
Et voir aussi cet article même s'il ne parle pas de Codable, qui n'existait pas encore:
https://developer.apple.com/swift/blog/?id=37
Ça explique au moins clairement comment utiliser les optionals.
Merci Ceroce,
en revanche j'ai un autre problème : les résultats de la partie "donnees" [[0, True], [1, True], [0, False]] que je souhaite afficher dans une NSTableView s'affichent de cette façon :
Pourrions-nous avoir du code ?
voila le code :
et ResponseData :
le code suivant qui est un test :
affiche les
double(0)
bool(true)
double(1)
bool(true)
double(0)
bool(false)
Pas de solution pour afficher uniquement les valeurs 0, true, 1, true, 0, false et non double(0), bool(true) etc... ?
Pour une raison que je ne comprends pas (et j'ai pas besoin de comprendre) tu mets tes résultats dans les membres d'un
enum
. Qui par défaut s'affiche comme ce que tu vois. Tu aurais rajouté uncase string(String)
tu y verrai aussi des choses du genrestring(Coucou)
.Bref pour éviter ça fais en sorte que
DetailsDatum
se conforme au protocolCustomStringConvertible
. Lis la doc pour comprendre.Petit exemple :
Merci pour vos aides respectives, j'ai ce que je veux avec ce code :
c'est l'outil de Pyroh https://app.quicktype.io/#l=swift qui m'avait généré un enum mais dans ce cas ce n'est pas la peine.
????? Pourquoi tout ce code ? Codable, c'est automatique sur les structs comme ça !
Et pourquoi transformer les valeurs en String là ?
Pour les afficher dans une tableView, tu fais la transformation lorsque tu les mets dans le tableView, pas pendant le décodage
Et pour la preuve que tu fais le code trop compliqué :
Et le contenu de Objets.json :
Merci Joanna, je vais étudier ton code.