web-dev-qa-db-fra.com

Convertir une chaîne Json en objet Json dans Swift 4

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")
15
Inderpal Singh

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]]
41
Amit

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.

12
Patru

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)

        }
1
Aviram Net