見出し画像

Vinyl Collections (レコード情報管理アプリを作る 2.3/5)

前回からだいぶ時間が経過していますが、今回は、APIから取得したJSONの処理について説明したいと思います。まずは、処理の流れを確認してみましょう。

データ取得後の全体的な処理の流れ

1. Discogs APIに検索キーとトークンをエンドポイントに投げる
2. 検索の結果を$$JSONに保存。
3. 検索結果を表示するための別ウィンドウを開く。
4. 既存検索結果の全データを削除する
5. $$JSONの検索結果を1件づつにバラして表示。

検索の実行と検索用レイアウトの表示

実際はもうちょっと細かいので順を追って説明してみます。この2つは前回の書いた通りなので、細かい説明は飛ばして、次の処理をみていきます。

・Discogs APIに検索キーとトークンを投げる
・検索の結果を$$JSONに保存。

スクリプトだとこの2行になります。ここで疑問が出てるくるはず。なぜなら、全レコードを削除しているからです。

画像4

23行目:検索結果を表示するためのレイアウトを別ウィンドウで開く
26行目:既存の検索結果を全て削除する

その理由は、APIで検索結果を取得して表示しているので、システム内にはそもそもデータはありません。なので、既存の検索結果が表示されると、正しい結果が表示されないため、削除という処理が必要になります。

APIで取得した内容の確認と後続処理の確認

次の処理は、取得したデータの有無と、その後処理です。

・検索結果の有無をチェックする。
・無い場合は、スクリプトを停止
・有る場合は、スクリプトの処理を継続。
 その後に必要な処理のデータを取得する

画像4

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の確認が必要になります。

スクリーンショット 2021-12-05 16.46.51

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の周り調査や実験に使わせて頂きます。スピーカーの作成や、ホロスコープの依頼もあれば、メッセージをください。