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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

Swift

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

Q&A

解決済

2回答

2458閲覧

swiftでJSONを扱うstructを作れません

HHaaaaa

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

Swift

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

0グッド

0クリップ

投稿2018/02/28 13:18

swift4の勉強を始めたところなのですが、以下でつまづいてます。
行いたい内容としては、以下のようなJSONを扱う構造体を作りたいと思っています。

JSON

{ "id": 1, "title": { "rendered": "hogehoge" }, "info": { "test:mediaUrl": [ { "source_url": "http://example.com/hoge.jpg", } ], "test:linkUrl": [ [ { "id": 1, "name": "http://example.com/?page=1", } ] ] } }

構造体(やりたいようなこと)

struct Test: Codable { var id: Int var title: Rendered var info: TestInfo struct Rendered: Codable { var rendered: String } struct TestInfo: Codable { var test:mediaUrl: TestInfoMedia var test:linkUrl: TestInfoLink } struct TestInfoMedia: Codable { var source_url: String } struct TestInfoLink: Codable { var id: String var name: String } }

出ているエラー

Type 'Test' does not conform to protocol 'Decodable'

Expected declaration

調査していたところ

変数の中に:を含めて使用することができなさそうなので、例えばですが、このような形でトライしてみてはいるのですが、うまく動作しません。いい解決方法をご教示いただけないでしょうか。

よろしくお願いいたします。

struct TestInfo: Codable { var mediaUrl: TestInfoMedia var linkUrl: TestInfoLink } enum CodingKeys: String, CodingKey { case mediaUrl = "test:mediaUrl" case linkUrl = "test:linkUrl" }

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

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

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

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

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

guest

回答2

0

Playgroundですと一応下記の形で出力できましたが、いかがでしょうか?

Swift

1 2import Foundation 3 4let json = """ 5{ 6 "id": 1, 7 "title": { 8 "rendered": "hogehoge" 9 }, 10 "info": { 11 "test:mediaUrl": [{ 12 "source_url": "http://example.com/hoge.jpg", 13 }], 14 "test:linkUrl": [ 15 [{ 16 "id": 1, 17 "name": "http://example.com/?page=1", 18 }] 19 ] 20 } 21} 22""" 23 24struct Test: Codable { 25 26 var id: Int 27 var title: Rendered 28 var info: Info 29} 30 31struct Rendered: Codable { 32 var rendered: String 33} 34 35struct Info: Codable { 36 var mediaUrl: TestMediaUrl 37 var linkUrl: TestLinkUrl 38 39 enum CodingKeys: String, CodingKey { 40 case mediaUrl = "test:mediaUrl" 41 case linkUrl = "test:linkUrl" 42 } 43} 44 45struct TestMediaUrl: Codable { 46 var elements: [Element] 47 48 struct Element: Codable { 49 var source_url: String 50 } 51} 52 53extension TestMediaUrl { 54 init(from decoder: Decoder) throws { 55 var elements: [Element] = [] 56 var unkeyedContainer = try decoder.unkeyedContainer() 57 while !unkeyedContainer.isAtEnd { 58 let element = try unkeyedContainer.decode(Element.self) 59 elements.append(element) 60 } 61 self.init(elements: elements) 62 } 63} 64 65 66struct TestLinkUrl: Codable { 67 68 var children: [[Child]] 69 70 struct Child: Codable { 71 var id: Int 72 var name: String 73 } 74} 75 76extension TestLinkUrl { 77 init(from decoder: Decoder) throws { 78 var result: [[Child]] = [[]] 79 if var array = try? Array<[Child]>(from: decoder) { 80 result = array 81 } 82 self.init(children: result) 83 } 84} 85 86 87let data = json.data(using: .utf8) 88 89do { 90 let test = try JSONDecoder().decode(Test.self, from: data!) 91 print(test.id) 92 print(test.info.linkUrl) 93 print(test.info.mediaUrl) 94 print(test.title.rendered) 95} catch let error { 96 print(error) 97} 98 99 100

投稿2018/03/01 00:43

newmt

総合スコア1277

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

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

0

ベストアンサー

定義

おかしかったのは、配列のことが考えられていないのと、TestInfoLink.idがIntになっていたこと、ぐらいかな。

swift

1struct Test: Codable { 2 3 var id: Int 4 var title: Rendered 5 var info: TestInfo 6 7 struct Rendered: Codable { 8 var rendered: String 9 } 10 11 struct TestInfo: Codable { 12 var mediaUrl: [TestInfoMedia] 13 var linkUrl: [[TestInfoLink]] 14 15 enum CodingKeys: String, CodingKey { 16 case mediaUrl = "test:mediaUrl" 17 case linkUrl = "test:linkUrl" 18 } 19 } 20 21 struct TestInfoMedia: Codable { 22 var source_url: String 23 } 24 25 struct TestInfoLink: Codable { 26 var id: Int 27 var name: String 28 } 29 30}

テスト

swift

1let stringJson = """ 2{ 3 "id": 1, 4 "title": {"rendered": "hogehoge"}, 5 "info": { 6 "test:mediaUrl": [ 7 {"source_url": "http://example.com/hoge.jpg"}, 8 {"source_url": "http://example.com/hogehoge.jpg"}, 9 ], 10 "test:linkUrl": [ 11 [ 12 {"id": 1, "name": "http://example.com/?page=1"}, 13 {"id": 2, "name": "http://example.com/?page=2"}, 14 ], [ 15 {"id": 3, "name": "http://example.com/?page=3"}, 16 ], 17 ] 18 } 19} 20""" 21 22if let data = stringJson.data(using: .utf8) { 23 if let json = try? JSONDecoder().decode(Test.self, from: data) { 24 print("id=(json.id)") 25 print("title.rendered=\"(json.title.rendered)\"") 26 print("[mediaUrl]") 27 json.info.mediaUrl.enumerated().forEach { 28 print("#($0.0) source_url=\"($0.1.source_url)\"") 29 } 30 print("[linkUrl]") 31 json.info.linkUrl.enumerated().forEach { 32 print("#($0.0)") 33 $0.1.enumerated().forEach { 34 print("\t#($0.0) id=($0.1.id), name=\"($0.1.name)\"") 35 } 36 } 37 } else { 38 print("decoding error") 39 } 40}

テスト結果

id=1 title.rendered="hogehoge" [mediaUrl] #0 source_url="http://example.com/hoge.jpg" #1 source_url="http://example.com/hogehoge.jpg" [linkUrl] #0 #0 id=1, name="http://example.com/?page=1" #1 id=2, name="http://example.com/?page=2" #1 #0 id=3, name="http://example.com/?page=3"

投稿2018/03/01 00:19

編集2018/03/01 01:53
fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問