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

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

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

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

Swift

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

Q&A

解決済

2回答

2484閲覧

Swift: JSONのパースに失敗する (Codable)

TEM

総合スコア15

JSON

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

Swift

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

1グッド

2クリップ

投稿2018/10/07 08:21

編集2018/10/07 09:00

前提・実現したいこと

SwiftでJSON形式のデータを取得し、パースしようとしているのですが上手くいきません。

API: 小説家になろうAPI (https://dev.syosetu.com/man/api/)

   https://api.syosetu.com/novelapi/api/?out=json&order=hyoka&of=t-n-u-w-s-gp-gl

APIから受け取ったJSON

[ { "allcount": 600319 }, { "title": "無職転生 - 異世界行ったら本気だす -", "ncode": "N9669BK", "userid": 288399, "writer": "理不尽な孫の手", "story": "34歳職歴無し住所不定無職童貞のニートは、ある日家を追い出され、人生を後悔している間にトラックに轢かれて死んでしまう。目覚めた時、彼は赤ん坊になっていた。どうやら異世界に転生したらしい。\n 彼は誓う、今度こそ本気だして後悔しない人生を送ると。\n\n【2015年4月3日23:00 完結しました】\n\n\n\n 完結後の番外編はこちらで連載中です。\n 無職転生 - 蛇足編 -\nhttp://ncode.syosetu.com/n4251cr/", "general_lastup": "2015-04-03 23:00:00", "global_point": 458346 }, { "title": "ありふれた職業で世界最強", "ncode": "N8611BV", "userid": 386841, "writer": "厨二好き/白米良", "story": "クラスごと異世界に召喚され、他のクラスメイトがチートなスペックと“天職”を有する中、一人平凡を地で行く主人公南雲ハジメ。彼の“天職”は“錬成師”、言い換えればただの鍛治職だった。最弱の彼は、クラスメイトにより奈落の底に落とされる。必死に生き足掻き、気がつけば世界最強・・・というありがちストーリー。最強物を書きたくて書きました。テンプレを多分に含みます//本編完結しました//書籍版8巻、外伝零2巻、漫画版3巻、日常版1巻、漫画版零1巻発売中です//コミックガルドにて各コミック無料配信中//アフターストーリー投稿中です", "general_lastup": "2018-10-06 18:00:00", "global_point": 407313 }, { "title": "転生したらスライムだった件", "ncode": "N6316BN", "userid": 311735, "writer": "伏瀬", "story": "突然路上で通り魔に刺されて死んでしまった、37歳のナイスガイ。意識が戻って自分の身体を確かめたら、スライムになっていた!\nえ?…え?何でスライムなんだよ!!!などと言いながらも、日々を楽しくスライムライフ。\n出来る事も増えて、下僕も増えて。ゆくゆくは魔王でも目指しちゃおうかな?\nそんな、どこかずれた天然主人公の異世界スライムライフです。\n※本編完結済み。\n 番外編は、人によっては蛇足。", "general_lastup": "2016-01-01 00:00:00", "global_point": 397260 },... ]

該当のソースコード

Swift

1import Foundation 2 3struct NovelOverviewModel: Codable { 4 let title: String 5 let ncode: String 6 let userid: String 7 let writer: String 8 let story: String 9 let general_lastup: Date 10 let global_point: Int 11}

Swift

1import Alamofire 2 3class NarouAPI { 4 5 var baseURL: String 6 7 init() { 8 baseURL = "https://api.syosetu.com/novelapi/api/" 9 } 10 11 func getTitles() { 12 let parameters: Parameters = [ 13 "out" : "json", 14 "order" : "hyoka", 15 "of" : "t-n-u-w-s-gp-gl" 16 ] 17 18 Alamofire.request(baseURL,method: .get, parameters: parameters, encoding: JSONEncoding.default).response { response in 19 guard let data = response.data else { return } 20 let overviewModels: [NovelOverviewModel] = try! JSONDecoder().decode([NovelOverviewModel].self, from: data) 21 22 } 23 } 24} 25

試したこと

JSONの一つ目の要素( {allcount:})をパースする際にエラーが起きると思い、そこを消してからパースしようとしましたが やり方がわかりませんでした。

補足情報

Alamofire, Codable, Swift 4.2

よろしくお願いします。

nun👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

そこを消してからパースしようとしました

の方法ではないのですが、

swift

1struct NovelOverviewModel: Codable { 2 let allcount: Int? 3 let title: String? 4 let ncode: String? 5 let userid: Int? //StringではなくIntです 6 let writer: String? 7 let story: String? 8 let general_lastup: String? //DateではなくStringです 9 let global_point: Int? 10}

と、allcountも含めて全てOptional型にしてしまえば、丸ごとパース出来ると思います。

Date型について

swift

1let general_lastup: Date?

にしたいのであれば、

swift

1let decoder = JSONDecoder() 2let df = DateFormatter() 3df.dateFormat = "yyyy-MM-dd HH:mm:ss" 4decoder.dateDecodingStrategy = .formatted(df)

のような感じでフォーマットを指定して下さい。

投稿2018/10/10 05:17

fuzzball

総合スコア16731

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

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

fuzzball

2018/10/10 05:26

Optional型にせず、allcountか書籍情報のどちらか、みたいに指定する方法(C言語のunion的な)もありそうな気がするのですが、すぐに見つからなかったのであきらめました。
TEM

2018/10/10 09:50

ご回答ありがとうございます。 パース出来ずに、困っていたので助かりました!
guest

0

間違った情報のため削除

投稿2018/10/10 13:06

編集2018/10/11 14:43
TEM

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問