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 tempsCodablepour que laJSONSerializationsoit terminée