@marumix (maru mix)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Swift5 RestApi JSONデータの取得

【Swift5】 WordpressサイトのRESTAPIで
WEB上のJSONデータを取得しTebleViewに表示したい

投稿のタイトルとアイキャッチ画像をTebleViewに表示したいのですが
とあるサイトではデータを取得しタイトルとアイキャッチ画像の一覧を取得・表示することができました
しかし、WordpressのRestApiで投稿を取得しようとしましたがエラーが出てしまいました。

取得・表示できた:例

JSON

"title": "初めてのIOSアプリ開発"
"user": {
       "mame": " 初心者くん"
       "source_url": "https://example.jp/img/mainphoto.jpg"
},

swift

//【構造体】が
struct Topic: Codable {
    let title: String
    let user: User
    enum CodingKeys: String, CodingKey {
       case title = "title"
       case user = "user"
    }
}
struct User: Codable {
    let sourceUrl: String
    enum CodingKeys: String, CodingKey {
       case sourceUrl = "source_url"
    }
}
//下記のように[Topic]という構造体でタイトル・アイキャッチ画像が取得ができました
if let data = data {
                do{
                    let topic = try JSONDecoder().decode([Topic].self, from: data)
                    self.topics = topic
                    DispatchQueue.main.async {
                    self.tableView.reloadData()
                    }
                    print("json: ", topic)
                } catch(let err){
                    print("失敗しました。:", err)
                }
            }

しかし下記のようなWordpressのJSONデータが取得できませんでした

"title": "初めてのIOSアプリ開発"
"_embedded": {
  "wp:featuredmedia": [
    {   
      "id": 1335,
      "media_type": "image",
      "mime_type": "image/jpeg",
      "source_url": "https://example.jp/img/mainphoto.jpg"
    }
        ],
}

swift

//【構造体】が
struct Topic: Codable {
    let title: Title
    let embedded: Embedded

    enum CodingKeys: String, CodingKey {
       case title = "title"
       case embedded = "_embedded"
    }
}


struct Embedded: Codable {
    let wpFeaturedmedia: WpFeaturedmedia

    enum CodingKeys: String, CodingKey {
       case wpFeaturedmedia = "wp:featuredmedia"
    }
}


struct WpFeaturedmedia: Codable {
    let sourceUrl: String

    enum CodingKeys: String, CodingKey {
       case sourceUrl = "source_url"
    }
}

if let data = data {
                do{
                    let topic = try JSONDecoder().decode([Topic].self, from: data)
                    self.topics = topic
                    DispatchQueue.main.async {
                    self.tableView.reloadData()
                    }
                    print("json: ", topic)
                } catch(let err){
                    print("失敗しました。:", err)
                }
            }
//でまた下記で[Topic]という構造体で取得しようとするも...

ビルドは成功するが取得時のエラーになる

失敗しました。: typeMismatch(Swift.Dictionary<Swift.String, Any>, 
Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "_embedded", intValue: nil), 
CodingKeys(stringValue: "wp:featuredmedia", intValue: nil)], 
debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

原因はよく見ると[ ]の配列が入っているから構造体の書き方が間違ってるのかな思います。

"wp:featuredmedia": [
    {   
      "id": 1335,
      "media_type": "image",
      "mime_type": "image/jpeg",
      "source_url": "https://example.jp/img/mainphoto.jpg"
    }
        ],

しかしこの後の解決策がよくわかりません。
大変申し訳ございません。どなたかご教授していただけないでしょうか
よろしくお願い致します。

0 likes

No Answers yet.

Your answer might help someone💌