見出し画像

Swiftでいこう --JSONって?

JSONとは軽量なデータの表記法で、もともとjavascriptで使われ、Swiftに限らず様々な言語で使われています。

主にwebでapiを叩いて取得してデータなどを活用する場合に使えます。今回はデータを取得してそのデータをテーブルに表示します。qiitaで「ローカルのJSONを読み込んでUITableViewで表示」を参考に説明してみます。swiftのpraygroundsを使っています。

まず、jsonを入れるstruct "User" を定義します。今回はidnameということで宣言しています。

struct User: Codable {
   var id: Int
   var name: String
}

そして、class TableViewController:UITableViewControllerを作り上げて行きます。

テーブルに入れる配列を定義していきます。

var users: [User]?

ということで、配列をつくります。配列のデータ型は構造体によりつくっていきます。

テーブルの必要なメソッド2つ実装していきます。

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return self.users?.count ?? 0
  }
  
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
      cell.textLabel?.text = "\(self.users?[indexPath.row].name ?? "null")"
      return cell
  }

それと、JSON をパースする方法は、

func loadJsonFile() {
       guard let path = Bundle.main.path(forResource: "users", ofType: "json") else { return }
       let url = URL(fileURLWithPath: path)
       do {
           let data = try Data(contentsOf: url)
           let users = try JSONDecoder().decode([User].self, from: data)
           self.users = users
       } catch  {
           print(error)
       }
   }

ですね。users.jsonをパースしていきます。

let users = try JSONDecoder().decode([User].self, from: data)
           self.users = users

で最初に宣言している配列の変数usersに入れます。

この関数 loadJsonFile()ですが、 最初に読み込まれる

override func viewDidLoad(){}

で読み込ませ、JSONを取得しています。

全文はこちら。

import UIKit
import PlaygroundSupport
struct User: Codable {
   var id: Int
   var name: String
}
class TableViewController : UITableViewController {
   
   var users: [User]?
   
   override func viewDidLoad() {
       super.viewDidLoad()
       loadJsonFile()
   }
   
   override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return self.users?.count ?? 0
   }
   
   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
       cell.textLabel?.text = "\(self.users?[indexPath.row].name ?? "null")"
       return cell
   }
   
   func loadJsonFile() {
       guard let path = Bundle.main.path(forResource: "users", ofType: "json") else { return }
       let url = URL(fileURLWithPath: path)
       do {
           let data = try Data(contentsOf: url)
           let users = try JSONDecoder().decode([User].self, from: data)
           self.users = users
       } catch  {
           print(error)
       }
   }
}
let tableViewController = TableViewController(style: .plain)
PlaygroundPage.current.liveView = tableViewController

users.jsonとして、

[
 {
"id": 1,
"name": "Alice",
 },
 {
"id": 2,
"name": "Bob",
 }
]

を記述しています。

この記事が気に入ったらサポートをしてみませんか?