PHPだと取得してパースすればいいだけですが、Swiftでは色々必要になるらしいので、記録しておきます。 APIをコールして、格納してforeachとかでぐるぐるしながら表示したりするのに使えたりしますね

予め構造体でjsonの構成を作った上で受信する

PHPだと何の準備もせず全部取得してそのまま配列やオブジェクトにしてますが、Swiftでは違うらしいです。Codableで受信する構造を作成してから格納するらしい。

サンプルjson

こんな感じのデータをとってみる

array(2) {
  ["count"]=>
  int(2)
  ["item"]=>
  array(2) {
    [0]=>
    array(2) {
      ["user_id"]=>
      int(123456)
      ["user_name"]=>
      string(15) "がちゃぴん"
    }
    [1]=>
    array(2) {
      ["user_id"]=>
      int(789101)
      ["user_name"]=>
      string(9) "ムック"
    }
  }
}

構造体を準備する

jsonとほぼそのままで作成する。

struct json_code:Codable{

    struct Item:Codable{
        let user_id:UInt
        let user_name:String
        
    }
    
    let count:UInt
    let item:[Item]

}

URLSessionを使って取得して構造体の形に基づき格納する

////guard letとか細かいことはなしにして以下で実行

let urlstr:String = "https://2ch-rank.net/api/apijsontest.php"
let requesturl = URL(string: urlstr)!
let request = URLRequest(url: requesturl)

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

    do{
        let decoder = JSONDecoder()
        let json = try decoder.decode(json_code.self,from:data!)
        print(json)
        
    }catch{
        print("json parse error")
        print(error)
        print(error.localizedDescription)
    }
 
}

task.resume()

実行結果

json_code(count: 2, item: [Page_Contents.json_code.Item(user_id: 123456, user_name: "がちゃぴん"), Page_Contents.json_code.Item(user_id: 789101, user_name: "ムック")])

Codableのjson_codeに基づいてきっちり格納できてることが格納できた。

で、もし仮にjsonと構造体のstructが不一致だったらどうなるのか?不一致にさせて実行してみる

jsonと構造体を不一致で実行させる

json parse error
keyNotFound(CodingKeys(stringValue: "unko", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"unko\", intValue: nil) (\"unko\").", underlyingError: nil))
データが見つからないため、読み込めませんでした。

catch部分がきっちり実行できてますね。

めんどくさい感じがしなくもないですが、データの整合性などをきっちり考慮して作る場合にはとてもいい言語なんだろうと思ったよね。

コメント