【楽天API／quicktype】jsonデータからswiftの構造体を自動生成する

# 楽天ウェブサービスとは？
楽天市場や楽天ブックス、楽天トラベルなどの商品データを取得できるWebAPIです。楽天アカウントと紐付けしてアプリ登録すると無料でサービスを利用することができます。取得できるデータは、jsonまたはxmlのデータ形式を選択できます。また、楽天アフィリエイトと連動して、楽天市場などで検索された商品が購入されると収益を得ることもできます。
楽天ウェブサービスへの登録は[こちら](https://webservice.rakuten.co.jp)から。

https://webservice.rakuten.co.jp

---------------------------------------
# JSONデータを取得する
[APIテストフォーム](https://webservice.rakuten.co.jp/explorer/api/IchibaItem/Search)からお試しでAPIを実行することができます。
今回は楽天市場商品検索APIで、返却形式をjson、キーワードを「スプラトゥーン」、ヒット件数を1件としてAPIを実行した例で説明します。

```
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?format=json&keyword=スプラトゥーン&hits=1&applicationId=[アプリID]
```
取得したJSONデータは以下の通り。

```
{
  "GenreInformation": [],
  "Items": [
    {
      "Item": {
        "affiliateRate": 2,
        "affiliateUrl": "",
        "asurakuArea": "",
        "asurakuClosingTime": "",
        "asurakuFlag": 0,
        "availability": 1,
        "catchcopy": "【楽天ブックスならいつでも送料無料】",
        "creditCardFlag": 1,
        "endTime": "",
        "genreId": "566404",
        "giftFlag": 0,
        "imageFlag": 1,
        "itemCaption": "任天堂 Nintendo Switch こちらの商品には「楽天ブックス限定特典」は付属いたしません。 楽天ブックス限定特典付きはこちら＞＞splatoon splatoon3 スプラ スプラ3 スプラトゥーン3 発売日：2022年09月09日 予約締切日：2022年09月07日 HACーPーAV5JA JAN：4902370550337 ゲーム Nintendo Switch シューティング その他",
        "itemCode": "book:20655233",
        "itemName": "スプラトゥーン3",
        "itemPrice": 5673,
        "itemUrl": "https://item.rakuten.co.jp/book/17134614/",
        "mediumImageUrls": [
          {
            "imageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0337/4902370550337.jpg?_ex=128x128"
          },
          {
            "imageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0337/4902370550337_2.jpg?_ex=128x128"
          },
          {
            "imageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0337/4902370550337_3.jpg?_ex=128x128"
          }
        ],
        "pointRate": 1,
        "pointRateEndTime": "",
        "pointRateStartTime": "",
        "postageFlag": 0,
        "reviewAverage": 4.55,
        "reviewCount": 395,
        "shipOverseasArea": "",
        "shipOverseasFlag": 0,
        "shopAffiliateUrl": "",
        "shopCode": "book",
        "shopName": "楽天ブックス",
        "shopOfTheYearFlag": 0,
        "shopUrl": "https://www.rakuten.co.jp/book/",
        "smallImageUrls": [
          {
            "imageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0337/4902370550337.jpg?_ex=64x64"
          },
          {
            "imageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0337/4902370550337_2.jpg?_ex=64x64"
          },
          {
            "imageUrl": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/0337/4902370550337_3.jpg?_ex=64x64"
          }
        ],
        "startTime": "",
        "tagIds": [
          1010510
        ],
        "taxFlag": 0
      }
    }
  ],
  "TagInformation": [],
  "carrier": 0,
  "count": 6929,
  "first": 1,
  "hits": 1,
  "last": 1,
  "page": 1,
  "pageCount": 100
}
```

---------------------------------------
# 構造体を自動生成する
jsonデータを入力するとswiftの構造体やクラスを自動で変換できる[quicktype](https://app.quicktype.io/)というwebサービスを紹介します。jsonデータから構造体を生成するのにコードでパースしながらトライ＆エラーで生成していましたが、このサービスを利用するとその作業が不要になりました！
UI画面にjsonデータをコピーするだけで構造体に変換されます。"Copy Code"ボタンを押すとクリップボードにコピーすることもできます。
![スクリーンショット 2022-09-24 1.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/dfb2db2f-4818-fef1-3fd8-ed0eb462f3a3.png)

変換できる言語はswift以外にも下記の言語に対応しています。
<img width="200" alt="スクリーンショット 2022-09-24 2.29.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/d188d7bd-d01e-676e-05ff-56e3c1d2fd97.png">


生成された構造体は以下の通り。
```
// This file was generated from JSON Schema using quicktype, do not modify it directly.
// To parse the JSON, add this file to your project and do:
//
//   let result = try? newJSONDecoder().decode(Result.self, from: jsonData)

import Foundation

// MARK: - Result
struct Result {
    let genreInformation: [Any?]
    let items: [ItemElement]
    let tagInformation: [Any?]
    let carrier, count, first, hits: Int
    let last, page, pageCount: Int
}

// MARK: - ItemElement
struct ItemElement {
    let item: ItemItem
}

// MARK: - ItemItem
struct ItemItem {
    let affiliateRate: Int
    let affiliateURL, asurakuArea, asurakuClosingTime: String
    let asurakuFlag, availability: Int
    let catchcopy: String
    let creditCardFlag: Int
    let endTime, genreID: String
    let giftFlag, imageFlag: Int
    let itemCaption, itemCode, itemName: String
    let itemPrice: Int
    let itemURL: String
    let mediumImageUrls: [ImageURL]
    let pointRate: Int
    let pointRateEndTime, pointRateStartTime: String
    let postageFlag: Int
    let reviewAverage: Double
    let reviewCount: Int
    let shipOverseasArea: String
    let shipOverseasFlag: Int
    let shopAffiliateURL, shopCode, shopName: String
    let shopOfTheYearFlag: Int
    let shopURL: String
    let smallImageUrls: [ImageURL]
    let startTime: String
    let tagIDS: [Int]
    let taxFlag: Int
}

// MARK: - ImageURL
struct ImageURL {
    let imageURL: String
}
```

また、WEBサービスのUI画面以外にもquicktypeをインストールして、コマンドラインでjsonファイルからswiftファイルを出力することなども可能です。詳しい方法はGitHubを参照してください。

https://github.com/quicktype/quicktype#readme

---------------------------------------

# iOSアプリ - 買い物リスト

楽天APIを利用して、買い物したい商品を入力するとジャンル別に自動整列したチェックリストにできる[アプリ](https://apps.apple.com/jp/app/id1546963840)をリリースしています。LINEなどで送られてきた買い物リストをまとめてコピペすることで一括でチェックリスト化することもできます。
仕組みとしては、入力された商品名をキーワードとして楽天市場商品検索APIで検索を実行し、返ってきた商品のジャンルIDから楽天市場ジャンル検索APIでジャンル名を検索しています。
あとは、商品が入力されるごとにジャンル別に整列するようにリストを更新しています。

<img width="180" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/8ca74d3a-7742-8fd0-6e89-848315f106f7.png>
<img width="180" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/988ba00f-17b8-682c-f977-7cff71af55e3.png>
<img width="180" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/dd631168-250f-500c-b113-cecf840458bd.png>
<img width="180" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/7bc2d009-de7e-ca0f-32f5-431153ce44fb.png>


https://apps.apple.com/jp/app/id1546963840