Vinyl Collections (レコード情報管理アプリを作る 2.3/5)
前回からだいぶ時間が経過していますが、今回は、APIから取得したJSONの処理について説明したいと思います。まずは、処理の流れを確認してみましょう。
データ取得後の全体的な処理の流れ
1. Discogs APIに検索キーとトークンをエンドポイントに投げる
2. 検索の結果を$$JSONに保存。
3. 検索結果を表示するための別ウィンドウを開く。
4. 既存検索結果の全データを削除する
5. $$JSONの検索結果を1件づつにバラして表示。
検索の実行と検索用レイアウトの表示
実際はもうちょっと細かいので順を追って説明してみます。この2つは前回の書いた通りなので、細かい説明は飛ばして、次の処理をみていきます。
・Discogs APIに検索キーとトークンを投げる
・検索の結果を$$JSONに保存。
スクリプトだとこの2行になります。ここで疑問が出てるくるはず。なぜなら、全レコードを削除しているからです。
23行目:検索結果を表示するためのレイアウトを別ウィンドウで開く
26行目:既存の検索結果を全て削除する
その理由は、APIで検索結果を取得して表示しているので、システム内にはそもそもデータはありません。なので、既存の検索結果が表示されると、正しい結果が表示されないため、削除という処理が必要になります。
APIで取得した内容の確認と後続処理の確認
次の処理は、取得したデータの有無と、その後処理です。
・検索結果の有無をチェックする。
・無い場合は、スクリプトを停止
・有る場合は、スクリプトの処理を継続。
その後に必要な処理のデータを取得する
43行目: IsEmpty($$JSON) で データが空かどうかの確認。
空だったら、スクリプトの停止。
次にページネーションの情報を$$JSONから取得していきます。
ここがアプリとして重要な機能になります。ただ結果を取得するだけなら、APIでデータを取得すれば良いのですが、件数が多い場合にすべてを処理しているとデータ処理が終わらず、いつまで経っても検索結果が表示されません。
実際の処理を見る前に、1ページに表示されるデータ件数は50件となりますが、検索キーを「シュガーベイブ」と「山下達郎」で、その結果を比べてみましょう。
シュガーベイブの場合:
"pagination": {"page": 1, "pages": 1, "per_page": 50, "items": 4,
山下達郎の場合:
"pagination": {"page": 1, "pages": 21, "per_page": 50, "items": 1033,
明らかに検索結果の件数が異なります。そうなるとページングするためのデータを取得しておき、そのデータを元にした処理が必要なります。
スクリプトでいうと、49行目から54行目までの処理になります。ここだけ見てもわからないので、取得した$$JSONの確認が必要になります。
JSONの該当箇所はこれで、JSONFormatElements関数で読みやすくしてありますが、実際は1行のデータでこれ以外の情報も$$JSONに入っています。そのため、下記となるように、JSONGetElementから必要な要素を取得します。
$pagination ; JSONGetElement( $$JSON ; "pagination")
{
"pagination" :
{
"items" : 1033,
"page" : 1,
"pages" : 21,
"per_page" : 50,
"urls" :
{
"last" : "https://api.discogs.com/database/search?q=XXXX ...&key=XXX ...secret=XXX ...x&page=21&per_page=50",
"next" : "https://api.discogs.com/database/search?q=XXXX ...&key=XXX ...secret=XXX ...x&page=2&per_page=50"
}
},
上記の部分が取れたら、そこから、次のエンドポイントとなるURLを$$next_url、$$last_url に格納しておきます。
$$next_url ; JSONGetElement( $$JSON ; "urls.next")
$$last_url ; JSONGetElement( $$JSON ; "urls.next")
変数名がグローバルになっているのは、ボタンで呼び出す際に利用できるようにするためです。通常のアプリで何気なく利用しているページングも同じ仕組みで処理されているので、処理方法としても参考になると思います。
解説を書きながら、スクリプトの手順を追っていく説明すると、Loopの外で処理すれば良いことかもと思いつつ、次回は、APIで取得した検索結果の中身を1件づつのレコードにする処理を説明します。
よろしければサポートをお願いします。頂いたサポートはAPIの周り調査や実験に使わせて頂きます。スピーカーの作成や、ホロスコープの依頼もあれば、メッセージをください。