93 votes

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

J'essaye de convertir une chaîne JSON en un objet JSON mais après JSONSerialization le résultat 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 le 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")

0 votes

Avez-vous ajouté le pod alamofire. google.com/

0 votes

Oui, j'ai installé Alamofire Pod

0 votes

Utilisez un do ... catch au lieu de cela et d'imprimer l'erreur. Cela vous dira probablement ce qui ne va pas.

138voto

Amit Points 2101

Le problème est que vous pensiez que votre jsonString est un dictionnaire. Ce n'est pas le cas.

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 j'obtiens la sortie :

[["form_desc": <null>, "form_name": Activity 4 with Images, "canonical_name": df_SAWERQ, "form_id": 3465]]

0 votes

Comment obtenir la valeur de "jsonArray". J'essaie si let name = jsonArray["name"] as ? String { // pas d'erreur } qui donne l'erreur "Cannot subscript a value of type '[Dictionary<String, Any>]' with an index of type 'String'".

2 votes

@Androidiseverythingforme : C'est un tableau de dictionnaire, essayez let form_name = jsonArray[0]["form_name"] as? String et vous obtiendrez la sortie.

42voto

Patru Points 1151

Utilisation de JSONSerialization s'est toujours sentie peu pratique et peu maniable, mais elle l'est encore plus avec l'arrivée de Codable dans Swift 4. Si vous maniez un [String:Any] devant un simple struct ça va ... faire mal. Regarde ça 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, la manipulation sera beaucoup plus confortable. Et vous obtenez beaucoup plus d'informations si votre JSON n'est pas analysé correctement.

0 votes

Suis-je le seul à recevoir le message "Le type 'Forme' n'est pas conforme au protocole 'Décodable'" ?

1 votes

Il faudrait que vous postiez votre code (dans une autre question, pas dans un commentaire, où il aurait l'air horrible) et votre version de Swift pour que quelqu'un puisse vous aider.

1 votes

Supprimez "import Cocoa" pour Swift 5 puis cela fonctionne. merci !

17voto

Aviram Netanel Points 425

J'ai essayé les solutions ici, et en tant que ? [String:AnyObject] a fonctionné 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)

}

0 votes

id est nulle pour moi.

8voto

Bhavsang Jam Points 117

J'ai utilisé le code ci-dessous et cela fonctionne bien pour moi :

let jsonText = "{\"userName\":\"Bhavsang\"}"
var dictonary:NSDictionary?

if let data = jsonText.dataUsingEncoding(NSUTF8StringEncoding) {

     do {
            dictonary =  try NSJSONSerialization.JSONObjectWithData(data, options: [.allowFragments]) as? [String:AnyObject]

            if let myDictionary = dictonary
              {
                  print(" User name is: \(myDictionary["userName"]!)")
              }
            } catch let error as NSError {

            print(error)
         }
}

0 votes

Travailler pour moi.......

-1voto

Divyansh Jain Points 125
static func getJSONStringFromObject(object: Any?) -> String? {
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: object ?? DUMMY_STRING, options: [])
        return String(data: jsonData, encoding: .utf8) ?? DUMMY_STRING
    } catch {
        print(error.localizedDescription)
    }
    return DUMMY_STRING
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X