2017-04-07 14 views
0

SwiftでJSONを解析するのに苦労しています。私はapiにリクエストを出し、JSONとしてデータを取得して辞書に変換する関数を書いています。その後、私はJSONから受け取った値から各タイトルとサブタイトルを設定するためにtableViewControllerを使用しようとしています。私はhomeTeamのタイトルとawayTeamの字幕を設定しようとしています。私はスウィフトについてあまり知らないので、私はいくつかの助けを望んでいた。ここでSwift Dictionaryを使用したJSONの解析

は辞書に保存されている私のJSONです:ここでは

dictionary = ["scoreboard": { 
    gameScore =  (
       { 
      game =    { 
       ID = 35119; 
       awayTeam =     { 
        Abbreviation = ATL; 
        City = Atlanta; 
        ID = 91; 
        Name = Hawks; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = CLE; 
        City = Cleveland; 
        ID = 86; 
        Name = Cavaliers; 
       }; 
       location = "Quicken Loans Arena"; 
       time = "7:30PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35120; 
       awayTeam =     { 
        Abbreviation = MIA; 
        City = Miami; 
        ID = 92; 
        Name = Heat; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = TOR; 
        City = Toronto; 
        ID = 81; 
        Name = Raptors; 
       }; 
       location = "Air Canada Centre"; 
       time = "7:30PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35121; 
       awayTeam =     { 
        Abbreviation = NYK; 
        City = "New York"; 
        ID = 83; 
        Name = Knicks; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = MEM; 
        City = Memphis; 
        ID = 107; 
        Name = Grizzlies; 
       }; 
       location = "FedEx Forum"; 
       time = "8:00PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35122; 
       awayTeam =     { 
        Abbreviation = DET; 
        City = Detroit; 
        ID = 88; 
        Name = Pistons; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = HOU; 
        City = Houston; 
        ID = 109; 
        Name = Rockets; 
       }; 
       location = "Toyota Center"; 
       time = "8:00PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35123; 
       awayTeam =     { 
        Abbreviation = SAS; 
        City = "San Antonio"; 
        ID = 106; 
        Name = Spurs; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = DAL; 
        City = Dallas; 
        ID = 108; 
        Name = Mavericks; 
       }; 
       location = "American Airlines Center"; 
       time = "8:30PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35124; 
       awayTeam =     { 
        Abbreviation = NOP; 
        City = "New Orleans"; 
        ID = 110; 
        Name = Pelicans; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = DEN; 
        City = Denver; 
        ID = 99; 
        Name = Nuggets; 
       }; 
       location = "Pepsi Center"; 
       time = "9:00PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35125; 
       awayTeam =     { 
        Abbreviation = MIN; 
        City = Minnesota; 
        ID = 100; 
        Name = Timberwolves; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = UTA; 
        City = Utah; 
        ID = 98; 
        Name = Jazz; 
       }; 
       location = "Vivint Smart Home Arena"; 
       time = "9:00PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35126; 
       awayTeam =     { 
        Abbreviation = OKL; 
        City = "Oklahoma City"; 
        ID = 96; 
        Name = Thunder; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = PHX; 
        City = Phoenix; 
        ID = 104; 
        Name = Suns; 
       }; 
       location = "Talking Stick Resort Arena"; 
       time = "10:00PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     }, 
       { 
      game =    { 
       ID = 35127; 
       awayTeam =     { 
        Abbreviation = SAC; 
        City = Sacramento; 
        ID = 103; 
        Name = Kings; 
       }; 
       date = "2017-04-07"; 
       homeTeam =     { 
        Abbreviation = LAL; 
        City = "Los Angeles"; 
        ID = 105; 
        Name = Lakers; 
       }; 
       location = "Staples Center"; 
       time = "10:30PM"; 
      }; 
      isCompleted = false; 
      isInProgress = false; 
      isUnplayed = true; 
      quarterSummary = "<null>"; 
     } 
    ); 
    lastUpdatedOn = "<null>"; 
}] 

は、私はスウィフトに私のタイトルとサブタイトルを設定するために、現在持っているものです。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "NBAScore", for: indexPath) 

     // Configure the cell...     
     if let scoreBoard = d.dictionary["scoreboard"] as? [String:AnyObject] 
     { 
      if let gameScore = scoreBoard["gameScore"] as? [String:AnyObject] 
       { 
        if let game = gameScore["game"] as? [String:AnyObject] 
         { 
          if let awayTeam = game["awayTeam"] as? String 
           { 
            cell.textLabel?.text = awayTeam        } 
         } 
       } 
     } 
     return cell 
    } 
+1

最後にJSONデータを深く掘り下げるべき場所は、 'cellForRowAt'です。あなたのJSONデータを読んだ後、一度適切なシンプルなデータモデルを構築してください。次に、そのシンプルなデータ配列をテーブルビューのデータモデルとして使用します。 – rmaddy

答えて

0

私は自分の質問に対する答えを見つけ出すことができました。私が誤ってタイプキャストしていたので、辞書の "gameScore"キーが私に困っていました。それは配列< [String:Any]>辞書ではありませんでした。

func parseJSON(){ 
      var s = nbaScore() 
      var i = 0 
      if let scoreBoard = d.dictionary["scoreboard"] as? [String:AnyObject] 
      { 
      // Could check the lastUpdattedOn date before doing the following: 
       if let gameScore = scoreBoard["gameScore"] as? Array<[String:Any]> 
       { //Loop for # of games 
        //while gameScore[i]["game"] as? [String:Any] != nil 
        while i < gameScore.count 
        //for _ in (gameScore[0]["game"] as? [String:Any])! 
        { 

        // An array of dictionaries 
         if let game = gameScore[i]["game"] as? [String:Any] 
          { 
           s.gameTime = (game["time"] as? String)! 

           if let awayTeam = game["awayTeam"] as? [String:Any] 
           { 
            s.awayTeamCity = (awayTeam["City"] as? String)! 
            s.awayTeamName = (awayTeam["Name"] as? String)! 
           } 
           if let homeTeam = game["homeTeam"] as? [String:Any] 
           { 
            s.homeTeamCity = (homeTeam["City"] as? String)! 
            s.homeTeamName = (homeTeam["Name"] as? String)! 
           } 

          } 
         if let isUnplayed = gameScore[i]["isUnplayed"] as? String 
         { 
          s.isUnplayed = isUnplayed 
         } 
         if let isInProgress = gameScore[i]["isInProgress"] as? String 
         { 
          s.isInProgress = isInProgress 
         } 
         if let isCompleted = gameScore[i]["isCompleted"] as? String 
         { 
          s.isCompleted = isCompleted 
         } 
         if let awayScore = gameScore[i]["awayScore"] as? String 
         { 
          s.awayTeamScore = awayScore 
         } 
         if let homeScore = gameScore[i]["homeScore"] as? String 
         { 
          s.homeTeamScore = homeScore 
         } 
         i += 1 
         scores.append(s) 
         s.clearData() 
         gamesCount += 1 
        } 
       } 
      } 
     } 
0

は、取得するために以下のコードを使用しますチーム名 -

if let scoreBoard = d.dictionary["scoreboard"] as? [String:AnyObject] 
     { 
      if let gameScore = scoreBoard["gameScore"] as? [String:AnyObject] 
       { 
        if let game = gameScore["game"] as? [String:AnyObject] 
         { 
          if let awayTeam = game["awayTeam"] as? [String: AnyObject] { 
            if let teamName = awayTeam["Name"] as? String { 
             cell.textLabel?.text = teamName 
            }        
           } 
         } 
       } 
     } 
+0

私はうまくいきませんでした。私は2番目の "if let"ステートメントを通過できません。 –

+0

別の回答を追加しました。上記の私の答えをチェックしてください。あなたのgameScoreオブジェクトは辞書ではない配列です。 –

0

最高の構造を追加するには、 dはその構造体から配列を作成し、forループを使ってjsonの配列を解析し、作成した配列にそれらを追加すると、cellForRow関数内のドット表記を使用してそれらのプロパティにアクセスできます

0

JSONディクショナリをいくつかのモデルオブジェクトに構文解析するためにビルドされたライブラリを使用するのがよい方法です。例えば。私はそれが軽量で使いやすいとMarshalをお勧めします。

構造体またはその他のSwift構造体を作成してから、マーシャリングを呼び出します。後で、それらのマッピングされたオブジェクトをtableView dataSourceで使用します。

0

あなたの 'gameScore'オブジェクトは辞書型ではありません([String:AnyObject])。私は間違いなくjsonオブジェクトを正しくチェックしていませんでした。

最初に配列を作成し、その配列にすべてのチーム名を格納します。例えば、私は配列の中にすべての遠隔地の名前を格納しています。以下のコードを確認してください。あなたのjsonに問題があるので、私は私の最後に以下のソースコードを実行しませんでした。これは有効なjsonデータではありません。書式設定の問題があります。しかし、これは以下のコードで動作します。

次に、各セルのtableViewデリゲートメソッドには、 'awayTeamArr'オブジェクトの特定のインデックスのオブジェクトが表示されます。この答えが働いたら、質問を完了してください。

関連する問題