1
votes

comment analyser les données json à partir de fichiers locaux?

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 commentaires

Copie possible de Lecture dans un fichier JSON avec Swift


Vous devriez utiliser Codable pour Swift 4. essayez! JSONSerialization.jsonObject (avec: données, options: []) renvoie Any . 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 temps Codable pour que la JSONSerialization soit terminée


3 Réponses :


7
votes

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 .


1 commentaires

tu es un sauveur



4
votes

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"


1 commentaires

tu es un sauveur



1
votes

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,"=======")
        }
    }
}


1 commentaires

très apprécié, vous êtes un sauveur