こんにちはしまーです。

サーバーとのやり取りでよくJSONデータがされてます。

XMLと比較して軽量でよみやすく軽量なので処理速度はXMLと比較して早いです。

今回は、SwiftでJSONデータを扱う方法についての紹介していきたいと思います。

 

 

 

JSONとは?

JSON (JavaScript Object Notation) は、軽量なデータ交換フォーマットです。JavaScriptプログラムの構造を表現するために使用されますが、多くのプログラミング言語でサポートされ使用することができます。

文字コードはUTF-8CSV、XMLより完結で可読性に優れており、サーバー、クライアント間のデータ送受信に多く使用されています。

今回は、実務で使用できるJSONのパース方法を2パターン紹介

パース:一定の書式や文法に従って記述されたデータを解析しプログラムで扱えるデータ構造の集合体に変換する事

 

JSONSerializationを使用したJSONのパース

JSONSerializationは標準フレームワークのFundationに含まれるJSONを扱うクラス。

使用する場合Foundationをインポートする。

import Foundation

 

HTTPサーバーからJSONデータを受け取る場合は、URLSessionで受け取ったデータをJSON形式に変換します。

JSONデータを受け取ってパースする例

let url = URL(string: "<http://example.com/data>")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
        print("Error: \\(error)")
    } else if let data = data {
        do {
            let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
            if let jsonDict = jsonObject as? [String: Any] {
                // Handle JSON data here
            }
        } catch {
            print("Error: \(error)")
        }
    }
}
task.resume()

 

この例では、JSONSerializationを使用してdataをJSONオブジェクトに変換し、そのオブジェクトを辞書型として取得しています。取得した辞書型のデータを適切に処理するためには、クロージャー内で適切な処理を実装する必要があります。

 

JSONEncoderを使用したJSONのパース

JSONEncoder・JSONDecoderを使用してSwiftデータをJSONへまたは、JSONをSwiftデータへ変換することができます。そこで必要なのがCodableプロトコルとなり、Codableプロトコルを使用してJSON⇔SWITデータ構造の変換をすることが可能となります。

 

Codable、Encodable、Decordable

  • protocol Encodable:キー、データからJSONへ変換
  • protocol Decodable:JSONからデータ構造への割り付け
  • typealias Codable:ENcodable & Decodable

 

/// 店舗グループデータ
struct ShopGroup: Decodable {
  /// 店舗グループ名
  var name: String
  /// 店舗情報リスト
  var shopList: [Shop]
  /// 最終更新日
  var updateDate: Date?
  enum CodingKeys: String,CodingKey {
    case name
    case shopList = "shop_list"
    case updateDate = "update_date"
  }
}
/// 店舗データ
struct Shop: Codable {
  /// 名前
  var name: String

  enum CodingKeys: String,CodingKey {
    case name
  }
}

 

let okazakiShoppingMall = ShopGroup ( name: "岡崎ショッピングモール", shopList: [
      Shop(name: "yakiniku家"),
      Shop(name: "伊太利亜麺家"),
      Shop(name: "中華麺家"),
    ],updateDate: Date())

 

・JSON→テストデータ構造への変換

 

//  JSONから変換
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601 // Dateフォーマット指定
guard let shopGroup: ShopGroup = try? decoder.decode(ShopGroup.self, from: jsonValue) else {
  fatalError("Failed to decode from JSON.")
}

print(shopGroup)  // 出力結果参照

 

出力結果

shopGroup(name: "岡崎ショッピングモール", shopList: [schedule_book.Shop(name: "yakiniku家"), schedule_book.Shop(name: "伊太利亜麺家"), schedule_book.Shop(name: "中華麺家")], updateDate: Optional(2023-04-25 21:00:49 +0000))

 

データ構造→JSONへの変換

データ構造をJSONに変換する場合はJSONEncoderを使用します。

 

//  JSONへ変換
    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted //  出力整形
    encoder.dateEncodingStrategy = .iso8601 // Dateフォーマット指定
    guard let jsonValue = try? encoder.encode(okazakiShoppingMall) else {
      fatalError("Failed to encode to JSON")
    }
    
    print(String(bytes: jsonValue, encoding: .utf8)  // 出力結果を参照

 

出力結果

{
   "name" : "岡崎ショッピングモール",
   "shop_list" : [
     {
       "name" : "yakiniku家",
     },
     {
       "name" : "伊太利亜麺家",
     },
     {
       "name" : "中華麺家",
     }
   ],
   "update_date" : "2023-04-26T21:22:36Z",
}

 

 

JSONで日時のマッピング

JSONEncoder,JSONDecoderのdateDecodingStratgyにDateフォーマットを指定することにより指定したフォーマットでDate型を扱うことが可能

 

・JSONDecoder

decoder.dateDecodingStrategy = .iso8601 // Dateフォーマット指定

 

・JSONEncoder

encoder.dateEncodingStrategy = .iso8601 // Dateフォーマット指定

 

Dateの扱い方についてわからないという方は以下の記事を参考にしてください。

 

 

Swift 日付操作まとめ集(Date)

    こんにちはしまーです。今回は、実際に実務で多様しているDate操作をまとめて紹介していきたいと思います。 コピペで使用するなどで作業効率アップにつなげていただ…

 

 

 

最後に

SwiftでのJSONの扱いかたを紹介しました。

最後までお読みいただきありがとうございます。

コーディングの際に少しでもお役に立てましたら嬉しい限りです。

 

 

 

 

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    CAPTCHA