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?
4 Réponses :
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.
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"
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 )
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.
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) } }