2017-10-18 2 views
0

Je tente de convertir une réponse JSON dans swift en un dictionnaire utilisable. Cela semblait être une tâche simple, mais la réponse JSON que je reçois est étrangement formatée, et peu importe ce que j'essaie, je suis incapable de la lancer dans un dictionnaire. Tous les exemples de Google que j'ai pu trouver supposer que le format de la réponse JSON sera le suivant:Réponse iOS Swift Casting JSON avec un format étrange dans le dictionnaire

{ 
    "someKey": 42.0, 
    "anotherKey": { 
     "someNestedKey": true 
    }, 
    { 
    "someKey": 42.0, 
    "anotherKey": { 
     "someNestedKey": true 
    } 

Cependant, la réponse d'impression rapide que je reçois en utilisant le code ci-dessous est formaté en suit:

{assets = (
    { 
    "someKey": 42.0, 
    "anotherKey": { 
     "someNestedKey": true 
    }, 
    { 
    "someKey": 42.0, 
    "anotherKey": { 
     "someNestedKey": true 
    } 
); 
} 

Voici autant de choses que j'ai pu obtenir en essayant de lancer ces données dans un dictionnaire dans swift. Il ajoute "assets" comme clé unique dans le dictionnaire, avec la valeur de cette clé étant le reste de la réponse.

let url = URL(string: "https://\(apiKey):\(password)@\(yourStore).myshopify.com/admin/themes/\(currentThemeID)/assets.json")! 

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
    if error != nil { 
     print(error) 
    } else { 
     if let urlContent = data { 
      do { 

       let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: [.allowFragments, JSONSerialization.ReadingOptions.mutableContainers]) 
       print(jsonResult) 
       if let dictionary = jsonResult as? [String: [String]] { 
        print(dictionary) 
       } 

      } catch { 
       print("json processing failed") 
      } 
     } 
    } 
} 
task.resume() 

Je suis assez sûr Raccrocher autour de la présence réside de la réponse JSON deux « entre parenthèses » et « point-virgule ». Je suis incapable de trouver de la documentation sur la façon dont ces caractères affectent la réponse, ou sur la façon de les gérer lors d'une tentative de down-cast dans swift.

Toute aide serait appréciée!

EDIT: Je ai tiré la réponse JSON dans mon navigateur, et est la mise en forme ici:

{"assets":[{"key":"assets\/1-1.png","public_url":"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/2125\/t\/22\/assets\/1-1.png?5272098227851596200","created_at":"2016-05-16T16:58:27-05:00","updated_at":"2016-05-16T16:58:27-05:00","content_type":"image\/png","size":9127,"theme_id":124078279}{"key":"templates\/search.liquid","public_url":null,"created_at":"2016-05-16T16:59:04-05:00","updated_at":"2016-05-16T16:59:04-05:00","content_type":"text\/x-liquid","size":2931,"theme_id":124078279}]} 

Cette réponse JSON n'a pas l'actif =(); partie en elle, et est formaté correctement. D'une façon ou d'une autre, mon code swift analyse incorrectement les données?

+0

Cette réponse est-elle le résultat de 'print (jsonResult)' ou des données de réponse réelles que vous obtenez? Il n'est pas valide json – dan

+0

@dan j'ai tiré la réponse dans mon navigateur, et il est correctement formaté là-bas. J'ai posté le résumé dans la question éditer ci-dessus. Cela me dit que le problème réside dans mon code Swift, et comment il analyse les données? –

+0

Pour répondre à votre question @dan, il s'agit du résultat de l'impression dans swift, pas de la réponse json réelle. –

Répondre

1

Transmettre de façon répétée en [String: Any] pour arriver à la partie de la réponse JSON souhaitée.

do { 
     let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: [.allowFragments, JSONSerialization.ReadingOptions.mutableContainers]) 
     print(jsonResult) 
     guard 
      let dictionary = jsonResult as? [String: Any], 
      let assetData = dictionary["assets"] as? [String: Any] else { 
       print("The JSON structure doesn't meet our expectations \(urlContent)") 
       return 
     } 
     print(assetData) 
    } catch { 
     print("json processing failed") 
    }