J'essaie de convertir une chaîne JSON en objet JSON, mais après JSONSerialization
, la sortie est nil
en JSON.
Chaîne de réponse:
[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]
J'essaie de convertir cette chaîne avec mon code ci-dessous:
let jsonString = response.result.value
let data: Data? = jsonString?.data(using: .utf8)
let json = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String:AnyObject]
print(json ?? "Empty Data")
Le problème est que vous pensiez que votre jsonString est un dictionnaire. Ce n'est pas.
C'est un tableau de dictionnaires. Dans les chaînes JSON brutes, les tableaux commencent par [
et les dictionnaires commencent par {
.
J'ai utilisé votre chaîne json avec le code ci-dessous:
let string = "[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]"
let data = string.data(using: .utf8)!
do {
if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
{
print(jsonArray) // use the json here
} else {
print("bad json")
}
} catch let error as NSError {
print(error)
}
et je reçois la sortie:
[["form_desc": <null>, "form_name": Activity 4 with Images, "canonical_name": df_SAWERQ, "form_id": 3465]]
Utiliser JSONSerialization
s'est toujours senti peu robuste et difficile à manier, mais c'est encore plus vrai avec l'arrivée de Codable
dans Swift 4. Si vous brandissez un [String:Any]
devant un simple struct
cela vous fera mal. Découvrez ceci dans un terrain de jeu:
import Cocoa
let data = "[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]".data(using: .utf8)!
struct Form: Codable {
let id: Int
let name: String
let description: String?
private enum CodingKeys: String, CodingKey {
case id = "form_id"
case name = "form_name"
case description = "form_desc"
}
}
do {
let f = try JSONDecoder().decode([Form].self, from: data)
print(f)
print(f[0])
} catch {
print(error)
}
Avec un minimum d'effort, vous vous sentirez beaucoup plus à l'aise. Et vous recevez beaucoup plus d'informations si votre JSON ne s'analyse pas correctement.
J'ai essayé les solutions ici, et comme? [String: AnyObject] a travaillé pour moi:
do{
if let json = stringToParse.data(using: String.Encoding.utf8){
if let jsonData = try JSONSerialization.jsonObject(with: json, options: .allowFragments) as? [String:AnyObject]{
let id = jsonData["id"] as! String
...
}
}
}catch {
print(error.localizedDescription)
}