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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

1904閲覧

[Swift]CodableでのJson読み込みについて

bbdd

総合スコア43

JSON

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/07/01 06:06

編集2018/07/01 06:08

前提

・Xcode Version 9.4.1
・Swift 4
・Jsonの読み込みにCodableを使用

詳細

APIのレスポンスとしてtitle が返ってきます。
返却値のパターンとしては下記のような2パターンが存在します。

"title": "タイトルだよ!" or "title": {}

①タイトルがStringとして格納されているパターン
②タイトルが空のパターンで{}が返却されるパターン

そこでこれに対応するために下記のようなJson読み込み処理をCodableを用いて書きました。

struct Hoge: Codable { let title: StringOrEmpty? }
struct Empty: Codable { } enum StringOrEmpty: Codable { case empty(Empty) case string(String) init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let x = try? container.decode(String.self) { self = .string(x) return } if let x = try? container.decode(Empty.self) { self = .empty(x) return } throw DecodingError.typeMismatch(StringOrEmpty.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for Budget")) } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { case .empty(let x): try container.encode(x) case .string(let x): try container.encode(x) } } }

②パターンあるのでcasestringemptyを作成して対応しました。

わからないこと

タイトルの値を取得できているのですが、値の中身がstring("タイトルだよ!")というように、caseで指定した形式string(String)となっています。(当然)

このstring("タイトルだよ!")の中身、タイトルだよ!を取り出したいのですがどうすれば良いのでしょうか?

let Hoge = try? JSONDecoder().decode(Hoge.self, from: data) if let title = Hoge.title { print(title) // string("タイトルだよ!") → "タイトルだよ!" 、後者の形にしたい }

ご教示頂けえると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1let hoge = try? JSONDecoder().decode(Hoge.self, from: data) 2 3if case let .string(title)? = hoge?.title { 4 5 print(title) 6} 7

投稿2018/07/01 14:40

MasakiHori

総合スコア3384

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問