2017-10-18 7 views
0

JSONレスポンスをすぐに使用可能な辞書にキャストしようとしています。これは単純な作業のようですが、私が得ているJSONレスポンスは奇妙な形になっています。何を試しても、それを辞書にキャストできません。しかしiOS Swift奇妙な形式のJSONレスポンスを辞書にキャスト

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

、私は以下のようにフォーマットされたコードを使用して受けています迅速で印刷応答:私は次のようにJSONレスポンスのフォーマットがされることを前提と見つけることができましたグーグルのすべての例次のようになります。

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

このデータを迅速に辞書にキャストしようとする限りです。それは辞書の単一のキーとして "資産"を追加し、そのキーの値は残りの応答全体です。

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() 

私はJSON応答の2「カッコ」の存在と「セミコロン」の周りに存在をハングアップかなり確信しています。これらの文字がどのようにレスポンスに影響するか、または迅速にダウンキャストしようとしているときにそれらを処理する方法に関するドキュメントを見つけることができません。

助けていただけたら幸いです!

EDIT: 私は私のブラウザでJSONレスポンスを引き上げ、ここでフォーマットされました:

{"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}]} 

このJSON応答は=()の資産を持っていません。その部分が正しくフォーマットされています。どうにかして私の迅速なコードが不適切にデータを解析していますか?

+0

この応答は 'print(jsonResult)'の結果か、実際の応答データですか。それは有効ではありませんjson – dan

+0

@ダン私は私のブラウザで応答を引き上げ、そこに正しくフォーマットされています。私は上の編集の質問にsnippitを投稿しました。これは私のSwiftコードに問題があり、どのようにデータを解析しているのかを教えてくれますか? –

+0

@danの質問に答えるために、それは実際のjsonレスポンスではなく、迅速にプリントされた結果です。 –

答えて

1

[String:Any]として繰り返しキャストして、必要なJSONレスポンスの部分を取得します。

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") 
    }