Je suis très nouveau dans l'analyse json et j'ai essayé d'analyser un fichier json contenant une liste de voitures, mais lorsque je fais l'analyse, cela donne nil
[{"brand": "Aston Martin", "models": ["DB11","Rapide","Vanquish","Vantage"]}]
et quand j'ai apporté des modifications à ce code comme ci-dessous
func jsonTwo(){ let url = Bundle.main.url(forResource: "car_list", withExtension: "json")! let data = try! Data(contentsOf: url) let JSON = try! JSONSerialization.jsonObject(with: data, options: []) print(".........." , JSON , ".......") let brand = JSON["brand"] as? [[String : Any]] print("=======",brand,"=======") }
puis j'obtiens une erreur en disant "Type 'Any' n'a aucun membre en indice"
ci-dessous est un exemple du fichier json que j'utilise
func jsonTwo(){ let url = Bundle.main.url(forResource: "car_list", withExtension: "json")! let data = try! Data(contentsOf: url) let JSON = try! JSONSerialization.jsonObject(with: data, options: []) as? [String : Any] print(".........." , JSON , ".......") let brand = JSON?["models"] as? [[String : Any]] print("=======",brand,"=======") }
3 Réponses :
L'objet externe est un tableau, veuillez noter le []
et la valeur pour les modèles
clés est un tableau de chaînes.
struct Car: Decodable { let brand : String let models : [String] } func jsonTwo() { let url = Bundle.main.url(forResource: "car_list", withExtension: "json")! let data = try! Data(contentsOf: url) let cars = try! JSONDecoder().decode([Car].self, from: data) for car in cars { let brand = car.brand let models = car.models print("=======",brand, models,"=======") } }
ou plus à l'aise avec Décodable
func jsonTwo() { let url = Bundle.main.url(forResource: "car_list", withExtension: "json")! let data = try! Data(contentsOf: url) let json = try! JSONSerialization.jsonObject(with: data) as! [[String : Any]] print(".........." , JSON , ".......") for item in json { let brand = item["brand"] as! String let models = item["models"] as! [String] print("=======",brand, models,"=======") } }
Normalement, vous êtes fortement déconseillé de forcer le déballage des options avec !
mais dans ce cas le code ne doit pas planter car un fichier du bundle d'application est en lecture seule au moment de l'exécution et tout plantage révélerait une erreur de conception .
tu es un sauveur
Vous avez besoin de
let JSON = try! JSONSerialization.jsonObject(with: data, options: [])
do { let url = Bundle.main.url(forResource: "car_list", withExtension: "json")! let data = try Data(contentsOf: url) let res = try JSONDecoder().decode([Root].self, from: data) print(res) } catch { print(error) }
Votre problème en tant que
struct Root: Codable { let brand: String let models: [String] }
renvoie Quelconque
, vous ne pouvez donc pas utiliser l'indice comme un dictionnaire ici JSON["brand"
tu es un sauveur
Veuillez noter que la variable JSON
dans votre code est un tableau d'objets.
Vous devez le diffuser correctement.
func jsonTwo(){ let url = Bundle.main.url(forResource: "car_list", withExtension: "json")! let data = try! Data(contentsOf: url) let JSON = try! JSONSerialization.jsonObject(with: data, options: []) print(".........." , JSON , ".......") if let jsonArray = JSON as? [[String: Any]] { for item in jsonArray { let brand = item["brand"] as? String ?? "No Brand" //A default value print("=======",brand,"=======") } } }
très apprécié, vous êtes un sauveur
Copie possible de Lecture dans un fichier JSON avec Swift
Vous devriez utiliser Codable pour Swift 4.
essayez! JSONSerialization.jsonObject (avec: données, options: [])
renvoieAny
. essayer essayer! JSONSerialization.jsonObject (avec: données, options: []) comme! [[String: AnyObject]] `s'il vous plaît éviter
essayez!
car cela peut planter l'application, vous devez également utiliser le tempsCodable
pour que laJSONSerialization
soit terminée