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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

594閲覧

Jsonファイルをどうしてもデコードできない

Racc

総合スコア4

JSON

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

1クリップ

投稿2023/03/20 16:37

実現したいこと

Xcodeでプロジェクト内に格納したJsonファイルをデコードしたい

前提

swift/Xcodeを利用しています。
プロジェクト内にJsonファイルを格納しており、デコードする際に「The data couldn’t be read because it is missing.」とエラーメッセージ(print)が出ます。

発生している問題・エラーメッセージ

念の為、関係ないと思われますが前後のメッセージも記載します。

jsonDataだよ 338953 bytes startGame Error: The data couldn’t be read because it is missing. ボタンを押しました

該当のソースコード

下記がデコード先のクラス情報です。

Swift

1struct FS_Epsord: Codable { 2 var id: UUID = UUID() 3 var title: String 4 var dunjeonName: String 5 var dunjeonText: String 6 var image: String 7 var difficulty: Int 8 var num: Int 9 var talks: [EpsordTalk] 10 var cleared: Bool 11 var firstTime: Bool 12 var encountTime: Int 13 var seconds: Int 14 var mobEnemys: [Int] 15 var bossEnemys: [Int] 16} 17 18class EpsordTalk: Identifiable, Codable { 19 var id = UUID() 20 var type: TalkType 21 var image: String 22 var name: String 23 var talk: String 24 var choice: String 25 26 enum CodingKeys: String, CodingKey { 27 case id 28 case type 29 case image 30 case name 31 case talk 32 case choice 33 } 34 35 init(id: UUID = UUID(), type: TalkType, image: String, name: String, talk: String, choice: String) { 36 self.id = id 37 self.type = type 38 self.image = image 39 self.name = name 40 self.talk = talk 41 self.choice = choice 42 } 43} 44 45enum TalkType: Codable { 46 case talk 47 case info 48 case choice 49}

そして下記がデコードする際のコードです。

Swift

1if let path = Bundle.main.path(forResource: "MAINSTROYEPSORDS", ofType: "json") { 2 do { 3 let jsonData = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) 4 print("jsonDataだよ") 5 print(jsonData) 6 let decoder = JSONDecoder() 7 let epsordData = try decoder.decode([FS_Epsord].self, from: jsonData) 8 FS_STORY_EPSORD_DATA = epsordData 9 // FS_STORY_EPSORD_DATAに配列としてデコードされたJSONデータが格納されます 10 print("エピソードのJsonデータの読み込みに成功しました") 11 12 } catch { 13 print("startGame Error: \(error.localizedDescription)") 14 } 15 }

また、下記がデコード対象のJsonデータです。

json

1[ 2 { 3 "title": "知らない世界", 4 "dunjeonName": "森の道", 5 "dunjeonText": "この世界では魔物と呼ばれる生物が人を襲うことがあるという。", 6 "image": "epsordA", 7 "difficulty": 0, 8 "num": 0, 9 "talks": [ 10 { 11 "type": ".talk", 12 "image": "okina", 13 "name": "翁", 14 "talk": "「なんじゃお主、こんなところで寝ておったのか?」", 15 "choice": "" 16 }, 17 { 18 "type": ".talk", 19 "image": "okina", 20 "name": "翁", 21 "talk": "「……まさか記憶がないのか? はたまた……」", 22 "choice": "" 23 }, 24 { 25 "type": ".talk", 26 "image": "okina", 27 "name": "翁", 28 "talk": "「そのままってわけにはいかんだろう。とりあえず街までいくかの」", 29 "choice": "" 30 }, 31 { 32 "type": ".talk", 33 "image": "okina", 34 "name": "翁", 35 "talk": "「そうじゃな、なんと呼べば良いかの」", 36 "choice": "" 37 }, 38 { 39 "type": ".choice", 40 "image": "player.image", 41 "name": "player.name", 42 "talk": "「player.nameだ」", 43 "choice": "「……player.nameだった気がする」" 44 }, 45 { 46 "type": ".talk", 47 "image": "okina", 48 "name": "翁", 49 "talk": "「そうか、それじゃあplayer.name。よろしくの」", 50 "choice": "" 51 }, 52 { 53 "type": ".talk", 54 "image": "okina", 55 "name": "翁", 56 "talk": "「弱いとはいえ魔物が出る。わしの側から離れるなよ」", 57 "choice": "" 58 } 59 ], 60 "cleared": false, 61 "firstTime": false, 62 "encountTime": 0, 63 "seconds": 1, 64 "mobEnemys": [ 65 0, 66 1 67 ], 68 "bossEnemys": [ 69 1, 70 1 71 ] 72 }, 73 { 以降割愛

試したこと

Key名の確認は何度もしましたし、Jsonファイルの破損もチェックサイトで確認しましたがありませんでした。
その他、Xcode上でビルドターゲットになっているかも確認しています。
もうGPTとも何度も確認しましたが分からず、何をやってもデコードができなかったので、なんとかお力添え頂きたく投稿いたしました。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Xcode
Version 14.2 (14C18)

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

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

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

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

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

hoshi-takanori

2023/03/20 18:48

id と type が怪しいですね。 JSON には id がありませんが、その際にデフォルト値を指定するにはデコーダを手動実装する必要があったような。というか、そもそも id を省略して読み込み時に生成するという設計がおかしい気がします。 type は、TalkType を String のサブタイプにすれば CodingKeys とか init とか不要で、ただし JSON 側の . (ピリオド) は不要です。 そして、cleared や firstTime などの変化しそうな値が入ってるのは不吉な匂いがしますね…。
Racc

2023/03/21 14:47

コメントありがとうございます! 下記のように修正したところ、Jsonの読み込みに成功しました! ``` enum TalkType: String, Codable { case talk case info case choice } ``` 原因はtypeだったようです。 一人では解決できませんでした、ありがとうございました。
guest

回答1

0

自己解決

hoshi-takanori様にコメントいただき、修正したところ読み込みに成功しました。
enum型で宣言したTalkTypeが原因だったようで、下記のように修正しました。

Swift

1enum TalkType: String, Codable { 2case talk 3case info 4case choice 5}

String型のサブタイプにして、Jsonコードも下記のように「.talk」から「talk」へ修正しています。(ドットを抜いています)

Json

1"talks": [ 2 { 3 "type": "talk", 4 "image": "okina", 5 "name": "翁", 6 "talk": "「なんじゃお主、こんなところで寝ておったのか?」", 7 "choice": "" 8 },

投稿2023/03/21 14:50

Racc

総合スコア4

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

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

Racc

2023/03/21 14:52

(追記) id = UUID()にも原因があったようです。 idを必要としないクラスへ変更したところ読み込みに成功しましたが、ここだけ戻してもまたエラーになったので、idとtypeの両方が原因だったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問