質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1219閲覧

jsonをデコードする際に使うstruc codableを教えてください

thesnowman

総合スコア154

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/24 13:06

編集2020/05/24 13:15

大変困っていますお助けくださいm(_ _)m

jsonデータをこのメソッドを使ってデコードしたいですJSONDecoder().decode(ResultJson.self, from: data!)

ですが、うまくデコードできません。
正しいcodableの記述が知りたいです。

codable

swift

1 struct Accounts: Codable{ 2 let bank_account_number: String? 3 } 4 5 struct Customers: Codable{ 6 let id: Int? 7 let name: String? 8 let email: String? 9 let phone_number: String? 10 let accesstoken: String? 11 } 12 13 struct Bank_Branches: Codable{ 14 let name: String? 15 } 16 17 struct Banks: Codable{ 18 let name: String? 19 } 20 21 struct List: Codable { 22 let accounts: Accounts? 23 let customers: [Customers]? 24 let bank_branches: Bank_Branches? 25 let banks: Banks? 26 } 27 28 struct Result: Codable{ 29 let list: [List]? 30 } 31 32 struct ResultJson: Codable{ 33 let result: [Result]? 34 let status: String? 35 }

jsonは以下の通りです。

json

1{ 2 "result": [ 3 { 4 "list": [ 5 { 6 "accounts": { 7 "bank_account_number": "0000015" 8 }, 9 "customers": { 10 "id": 4, 11 "name": "testname", 12 "email": "test@gmail.com", 13 "phone_number": "5678", 14 "accesstoken": "MIxNW76bjzWL6CPx35wagh8ZiHk6SprI" 15 }, 16 "bank_branches": { 17 "name": "setagaya" 18 }, 19 "banks": { 20 "name": "test" 21 } 22 } 23 ] 24 } 25 ], 26 "status": "success" 27}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スネークケースが含まれているので、CodingKeyに準拠させるか、あるいは.convertFromSnakeCase の設定が必要となります。

追記:私の回答とご質問の追記が前後してしまったようですが、もし条件によっては返されないフィールドがあるようであれば、ご質問中のコードのようにプロパティを Optional 型にする必要がありますのでご注意ください。

Swift

1import UIKit 2 3struct RootClass: Codable { 4 var result : [Result] 5 var status : String 6} 7 8struct Result: Codable { 9 var list : [List] 10} 11 12struct List: Codable { 13 var accounts : Account 14 var bankBranches : BankBranche 15 var banks : BankBranche 16 var customers : Customer 17// .convertFromSnakeCaseの設定をしない場合には以下の行を有効にする。以下同様。 18// enum CodingKeys: String, CodingKey { 19// case accounts 20// case bankBranches = "bank_branches" 21// case banks 22// case customers 23// } 24} 25 26struct Customer: Codable { 27 var accesstoken : String 28 var email : String 29 var id : Int 30 var name : String 31 var phoneNumber : String 32 33// enum CodingKeys: String, CodingKey { 34// case accesstoken 35// case email 36// case id 37// case name 38// case phoneNumber = "phone_number" 39// } 40} 41 42struct BankBranche: Codable{ 43 var name : String 44} 45 46struct Account: Codable { 47 var bankAccountNumber : String 48 49// enum CodingKeys: String, CodingKey { 50// case bankAccountNumber = "bank_account_number" 51// } 52} 53 54let data = """ 55{ 56 "result": [ 57 { 58 "list": [ 59 { 60 "accounts": { 61 "bank_account_number": "0000015" 62 }, 63 "customers": { 64 "id": 4, 65 "name": "testname", 66 "email": "test@gmail.com", 67 "phone_number": "5678", 68 "accesstoken": "MIxNW76bjzWL6CPx35wagh8ZiHk6SprI" 69 }, 70 "bank_branches": { 71 "name": "setagaya" 72 }, 73 "banks": { 74 "name": "test" 75 } 76 } 77 ] 78 } 79 ], 80 "status": "success" 81} 82""".data(using: .utf8)! 83 84let jsonDecorder = JSONDecoder() 85 86// 以下の設定をしない場合には enum CodingKeys: String, CodingKey {} が必要 87jsonDecorder.keyDecodingStrategy = .convertFromSnakeCase 88 89let json = try! jsonDecorder.decode(RootClass.self, from: data) 90 91dump(json) 92

投稿2020/05/24 13:29

編集2020/05/24 14:24
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thesnowman

2020/05/24 14:11

ありがとうございます! まる1日悩んだことがあっさり解決しました! ほんとうに感謝です!!!1
thesnowman

2020/05/24 14:13

もしよろしかったら、一緒に回答いただけたら大変助かるのですが 下から三行目で定義したjsonなのですが これはいけるのに↓ print(json.result) これだとエラーになります。どんな理由が考えられますか? print(json.result.list) エラーは Value of type '[LoginPageViewController.Result]?' has no member 'list' というものです
TsukubaDepot

2020/05/24 14:18

JSONの構造を見ると > "list": [ となっていますから、listは配列となります。 なので、たとえば json.result[0].list とすれば見られると思います。
TsukubaDepot

2020/05/24 14:20

指摘する行を間違っていました。 > "result": [ ですが、やはり配列なので([で始まっているので)先のように配列として指定する必要があります。
thesnowman

2020/05/24 15:02

本当に助かりました!!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問