SwiftでネストJSONを読み込んで構造体に格納して検索
公開日: 2023-11-09 22:15:58
SwiftでJSONを読み込んで構造体に格納してから、検索するまでのパート2です。
今回はネストされたJSONファイルを扱っていきます。
ネストされたJSON構造は、Swiftの中間の構造体を使って解決することができます。
例えば、以下のようなネストされたJSONファイルがあった場合:
[
{
"id": 1,
"name": "Alice",
"contact": {
"email": "alice@example.com",
"phone": "123-456-7890"
}
},
{
"id": 2,
"name": "Bob",
"contact": {
"email": "bob@example.com",
"phone": "098-765-4321"
}
}
]
このJSONでは、各ユーザーがcontactというネストされたオブジェクトを持っています。Swiftでこれをデコードするには、ネストされたcontactオブジェクト用の構造体も定義する必要があります。
以下の例では、まずネストされたJSON構造に対応するSwift構造体を定義しています。
import Foundation
// ユーザーの構造体
struct User: Codable {
var id: Int
var name: String
var contact: Contact
}
// 連絡先情報の構造体
struct Contact: Codable {
var email: String
var phone: String
}
次に、同じ方法でJSONファイルを読み込んでデコードします。
func loadJSONFromFile() -> [User]? {
guard let url = Bundle.main.url(forResource: "example", withExtension: "json") else {
print("JSON file not found")
return nil
}
do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let users = try decoder.decode([User].self, from: data)
return users
} catch {
print("Error decoding JSON: \(error)")
return nil
}
}
ネストされたデータを扱う際の検索機能も同様に実装できます。
たとえば、ユーザーのメールアドレスによる検索は以下のようになります。
func searchUser(byEmail email: String, in users: [User]) -> User? {
return users.first { $0.contact.email == email }
}
実行例もネストではないものと同じように使いますが、contactプロパティを通じてメールアドレスにアクセスする点が異なります。
if let users = loadJSONFromFile() {
if let foundUser = searchUser(byEmail: "alice@example.com", in: users) {
print("Found user: \(foundUser.name)")
} else {
print("User not found")
}
}
これで、ネストされたJSON構造にも対応するSwiftコードを作成することができます。