Swiftの取説 JSON編
こんにちはしまーです。
サーバーとのやり取りでよく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でのJSONの扱いかたを紹介しました。
最後までお読みいただきありがとうございます。
コーディングの際に少しでもお役に立てましたら嬉しい限りです。