Balbas Code

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コードを作成することができます。