3
votes

json n'analyse pas correctement

J'ai donc essayé d'analyser un fichier json et quand je l'ai analysé selon la syntaxe, cela me donne une erreur qui ne peut pas changer la chaîne en un tableau de dictionnaire, mais lorsque je corrige le problème, cela génère nil . Quelqu'un peut-il donner un avis

func jsonFour() {
    let string = "[{\"address\": 7023000630,\"reportStatus\": \"Retrieved\",\"currentLocation\": {\"latitude\": 29.8529, \"longitude\": 73.99332,\"timestamp\": \"2019-01-07T16:35:25.079+05:30\"} }, {\"address\": 7290098339, \"reportStatus\": \"Retrieved\", \"currentLocation\": {\"latitude\": 21.628569, \"longitude\": 72.996956,\"timestamp\": \"2019-01-07T16:35:25.079+05:30\" } } ]"

    let data = string.data(using: .utf8)!
    do {
        if let jsonArray = try JSONSerialization.jsonObject(with: data, options : JSONSerialization.ReadingOptions.mutableContainers) as? [[ String : Any ]]
        {
            print(jsonArray) // use the json here
            let address = jsonArray["address"] as! [[String:Any]]
            if let timestamp = address["timestamp"] as? [String]{print(timestamp)}
        } else {
            print("bad json")
        }
    } catch let error as NSError {
        print(error)
    }

}

Lorsque je supprime les doubles crochets de "String: Any" , cela fonctionne bien, mais ne donne aucune valeur sauf nul .

Et quand je procède de cette façon, il ignore l'instruction if et affiche simplement "bad json" .

Qu'est-ce que je fais de mal ici?


0 commentaires

4 Réponses :


2
votes

Puisqu'il existe Codable , je vous recommande fortement de l'utiliser au lieu de JSONSerialization .

Commencez donc par déclarer vos structures pour qu'elles correspondent à votre structure JSON

do {
    let data = string.data(using: .utf8)!
    let models = try JSONDecoder().decode([Model].self, from: data)
} catch {
    print(error)
}

Décodez maintenant simplement votre JSON en utilisant JSONDecoder

struct Model: Codable {
    var address: Int
    var reportStatus: String
    var currentLocation: Location
}

struct Location: Codable {
    var latitude, longitude: Double
    var timestamp: String
}

... maintenant models est un tableau d'objets Model et vous pouvez travailler avec.


0 commentaires

1
votes

Bien sûr, vous devriez utiliser Codable pour cela, mais pour que votre code s'exécute, utilisez

let address = jsonArray["address"] as! [[String:Any]]

Votre problème évident est ici

XXX

jsonArray est un tableau que vous ne pouvez pas indiquer avec ["address"


0 commentaires

1
votes

Un tableau est une liste. Il peut contenir plusieurs éléments. Vous devez utiliser une boucle pour parcourir un tableau (comme dans votre question précédente )

  • La valeur de la clé adresse est Int (sans guillemets doubles).
  • La valeur de la clé timestamp est String et se trouve dans le dictionnaire de la clé currentLocation dans le tableau

    let data = Data(string.utf8)
    do {
        if let jsonArray = try JSONSerialization.jsonObject(with: data) as? [[String : Any]]
        {
            print(jsonArray) // use the json here
            for item in array {
               let address = item["address"] as! Int
               let currentLocation = item["currentLocation"] as! [String:Any]
               let timestamp = currentLocation["timestamp"] as! String
               print(timestamp)
            }
        } else {
            print("bad json")
        }
    } catch {
        print(error)
    }
    

N'utilisez jamais .mutableContainers dans Swift. C'est inutile.


0 commentaires

1
votes

Dans votre extrait de code, jsonArray est un tableau et le tableau ne peut pas indiquer une valeur de type [[String: Any]] , donc à la place vous devriez analyser comme,

func jsonFour(){
    let string = "[{\"address\": 7023000630,\"reportStatus\": \"Retrieved\",\"currentLocation\": {\"latitude\": 29.8529, \"longitude\": 73.99332,\"timestamp\": \"2019-01-07T16:35:25.079+05:30\"} }, {\"address\": 7290098339, \"reportStatus\": \"Retrieved\", \"currentLocation\": {\"latitude\": 21.628569, \"longitude\": 72.996956,\"timestamp\": \"2019-01-07T16:35:25.079+05:30\" }}]"

    let data = string.data(using: .utf8)!
    do {
        if let jsonArray = try JSONSerialization.jsonObject(with: data, options : JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]]
        {
            print(jsonArray) // print the json here
            for jsonObj in jsonArray {
                if let dict = jsonObj as? [String: Any] {
                    if let address = dict["address"] {
                        print(address)
                    }
                    if let location = dict["currentLocation"] as? [String: Any], let timeStamp = location["timestamp"]  {
                        print(timeStamp)
                    }
                }
            }
        } else {
            print("bad json")
        }
    } catch let error as NSError {
        print(error)
    }
}


0 commentaires