2016-09-15 13 views
8

Swift 3でJSONのシリアライズの簡単な原則を理解しています。ウェブサイトからJSONをデコードして配列に変換できるので、jsonResult["team1"]["a"]などとアクセスできますか?ここに関連するコードは次のとおりです。Swiftを使用したJSONSerialization 3

let httprequest = URLSession.shared.dataTask(with: myurl){ (data, response, error) in 

self.label.text = "RESULT" 

    if error != nil { 

     print(error) 

    } else { 

     if let urlContent = data { 

      do { 

       let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: 
        JSONSerialization.ReadingOptions.mutableContainers) 

       print(jsonResult) //this part works fine 

       print(jsonResult["team1"]) 

       } catch { 

        print("JSON Processing Failed") 
       } 
      } 
     } 
    } 
    httprequest.resume() 

の着信JSONは次のとおりです。

{ 
team1 = { 
    a = 1; 
    b = 2; 
    c = red; 
}; 

team2 = { 
    a = 1; 
    b = 2; 
    c = yellow; 
}; 
team3 = { 
    a = 1; 
    b = 2; 
    c = green; 
}; 
} 

おかげスウィフト3では

答えて

10

JSONSerialization.jsonObject(with:options:)の戻り値の型がAnyとなっています。

(あなたがjsonResult上を向いて、あなたのXcodeのクイックヘルプペインでそれを確認することができます。)

そして、あなたはAnyとして型指定された変数のための任意の方法またはサブスクリプトを呼び出すことはできません。 Anyで作業するには、明示的な型変換が必要です。

if let jsonResult = jsonResult as? [String: Any] { 
     print(jsonResult["team1"]) 
    } 

そしてNSArrayのデフォルトのエレメントタイプ、NSDictionaryのデフォルト値の種類もAnyになってきました。 (これらのことをすべて「id-as-Any」と呼びます。SE-0116

JSON構造を深く理解したい場合は、他の明示的な型変換が必要な場合があります。

 if let team1 = jsonResult["team1"] as? [String: Any] { 
      print(team1["a"]) 
      print(team1["b"]) 
      print(team1["c"]) 
     } 
0

ありがとうございます。 OOPerの情報が助けになりました。しかし、私のjsonを再フォーマットすることが本当に助けになったのは:

{ "teams": [ { "a": 1, "b": 2, "c": "red" }, { "a": 1, "b": 2, "c": "yellow" }, { "a": 1, "b": 2, "c": "green" } ] } 
関連する問題