【FileMaker】JSON形式でスクリプト引数を実装するときのTips

さて、今回はスクリプト引数についてです。
FileMaker バージョン15まではスクリプト引数のやり方としては、改行コードや固有の記号で区切ったりしていましたが、[バージョン16からJSON,cURLが実装](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help/json-functions.html)されたことから、JSON形式でスクリプト引数を実装できるようになりました。
（正確には、「やろうと思えばやれる」？）

JSONの基本的な使い方は、過去の[記事](https://qiita.com/tyuma/items/99a4a613dd0c8f8cf392)にも書いていますが、今回はJSON形式でスクリプト引数を実装するときのTipsについて書きます。

FileMakerは得意だけれど、JSONは尻込みしてしまう方もいらっしゃるのではないでしょうか？
世の中の主流に一歩近づくためにも、JSON、慣れていきましょうね。

# JSON形式をスクリプト引数に実装するってどういうこと？

JSON形式では、
keyとvalueをワンセット
にして保持できます。

フィールド名を指定したら、そのフィールドに入っているデータを取得できるのと同じように、keyを指定したらそこに保存されているvalueが取得できます。
これをスクリプト引数に応用する形です。

例えば、
・id
・name
・cnt
というフィールドのデータをスクリプトの引数にしたい場合、
"id"をkeyに、idの値をvalueにして（以下同様）スクリプトに渡し、「idくれ」と言うと「idはこのデータ」と渡してくれる、と言う感じでしょうか。

# メリットは？
メリットは、
・引数の順番に左右されない
ことです。

FileMakerのスクリプト引数は、複数の引数を使う場合、その順番に気をつけなければなりません。
JSONでは、先に述べたようにkeyとvalueで実装できるので、順番を気にする必要はありません。

# デメリットは？
デメリットは、
・JSONの書き方を覚える
・データの型を気にする
というところです。

JSONの書き方は、通常の関数と同様に提供されているので、覚えるしかありません。
しかし、データの型を気にするのは他の[高水準言語](https://www.weblio.jp/content/%E9%AB%98%E7%B4%9A%E8%A8%80%E8%AA%9E)ではよくありますが、今までのFileMakerの引数では考えなかったことではないでしょうか？

JSON形式は、値のタイプとして
・JSONString
・JSONNumber
・JSONObject
・JSONArray
・JSONBoolean
・JSONNull
・JSONRaw
の種類があります。
これらを意識してセットすることになるので、テーブル定義で設定したデータの型を確認しなくてはなりません。


# JSON形式でセットするときのTips
## 値のタイプを実は数字で指定できる
値のタイプを文字列でセットするのは、覚えるのが大変、、、と思いますが、実は数字でも指定できます。
詳しくは[ヘルプ](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help%2Fjsonsetelement.html%23ww1149903)をご覧ください。
ここでは、値のタイプについて文字列と数字を表にします。

|文字列|数字|
|------+----|
|JSONString|1|
|JSONNumber|2|
|JSONObject|3|
|JSONArray|4|
|JSONBoolean|5|
|JSONNull|6|
|JSONRaw|0|

↓文字列で指定した場合。
<img width="572" alt="JSONArg1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/156c51be-e473-2424-8822-ef7f541c2a7d.png">

↓数字で指定した場合
<img width="544" alt="JSONArg2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/18c1e062-b698-36d5-7ad2-00dd64005312.png">

わかりやすいのは文字列ですが、綴りを間違えたくないという場合は、数字での実装が簡単かもしれません。

これを実行してみましょう。
<img width="529" alt="JSONArg5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3b081c05-6ffe-6440-95d9-03ae66df997e.png">

スクリプトは、以下のような感じです。
<img width="669" alt="JSONArg4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3131aa8e-bfd7-5722-c1c0-acae6e81b064.png">

スクリプトを実行するボタンをクリックすると、JSON引数で指定したデータをそれぞれ取得して「スクリプト実行結果」に表示する、という単純なサンプルです。
<img width="948" alt="JSONArg3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/c2929e72-901e-c09d-05c0-1016773d5251.png">

## JSONNullを活用しよう
今までの引数の指定方法で、複数引数があるときに値が存在しない、もしくは指定しない場合、
「""」
を指定していた方もいらっしゃるのではないでしょうか？
もともとFileMakerではデータベースの概念として「空白」は「""」として表現していて、他言語でもよくあります。
また、「空白・空白でない」をチェックする"[IsEmpty](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help%2Fisempty.html)"関数が使われてきました。
空白を指定するときは「""」という文字列を指定するときのダブルクォーテーションですが、技術者間の連携不足で何かしらの修正などで文字列に変わることもあります。（経験者）
JSON形式では、「空白」として明示的に[NULL](https://ja.wikipedia.org/wiki/Null)が使用できますので、JSONNullを使って、明示的に「そのキーには値が存在しない」とできます。

本当に余談ですが、他言語経験が長い私は、「空白とNULLは違う」世界（""はデータのアドレスが確定するが、NULLはアドレスが確定しないなどなど）でしたので、文字列にNULLを突っ込む場面は「 [NullPointerException](https://ja.wikipedia.org/wiki/NullPointerException) ...」と若干焦ります。（ [空文字](https://ja.wikipedia.org/wiki/%E7%A9%BA%E6%96%87%E5%AD%97%E5%88%97) の扱いは、言語によって色々あります）

JSONNullを指定した引数のサンプルです。
<img width="506" alt="JSONArg6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/823666c5-396b-a364-be6b-fcdd87ff34b4.png">

実際のvalueに当たる部分にも、JSONNullを指定できます。
※この場合、JSONNullを指定したというのは、「指定する値がない」ということなので、指定したフィールドの値が空白かどうか、ということではありません。

引数のタイプは、もちろんJSONNullです。

実行すると、[JSONFormatElements](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help%2Fjsonformatelements.html%23ww1149413)で取り出してみるとJSON型のスクリプト変数値のnameにnullが設定されていること、そしてローカル変数に取り出して表示すると何も表示されない（"")ことがわかります。
<img width="956" alt="JSONArg7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/1421e875-0a64-d352-b6f6-1b252e18c817.png">


## JSONBooleanを活用しよう
TRUE/FALSEを指定するときや、ON/OFFを指定するとき、1と""などローカルに決めていませんでしたか？
なんのための1なのか、なんのための""なのか、可読性が低くなりがちです。

### TRUE
JSONBooleanなら、TRUE/FALSEをそのまま使えます。
<img width="500" alt="JSONArg8.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/7ab19c5d-8ff1-b3fc-3b21-abe133207f4d.png">

スクリプトのIF文では、booleanなのでそのまま今まで通りtrue/falseができます。
<img width="701" alt="JSONArg9.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/39aeefd6-83c7-813e-195b-c678cf51ffc2.png">

JSONの中ではtrue、変数に保存すると、trueは「1」で保存されます。
<img width="645" alt="JSONArg10.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3e048f88-3194-afdb-07ba-5a2d691183f6.png">

### FALSE
falseはどうでしょう。
これもそのまま"false"と指定して、タイプをJSONBooleanにするだけです。
<img width="487" alt="JSONArg11.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3d5f5a47-33be-f290-3aa5-8a738573d57f.png">

falseは、JSONでは"false"、変数では「0」なので、true同様スクリプト内でもそのまま活用ができます。
<img width="591" alt="JSONArg12.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/fdb161d8-6251-364a-057c-3f0f057f758f.png">

## スクリプト名にkey名をつける
key名はスクリプトを開かないとわからないのは、通常のスクリプト引数と一緒です。
これだとJSONを使っているありがたさが半分しかないです。
他の方もやられているかと思いますが、スクリプト名にkey名をつけて実装するのがおすすめです。
<img width="318" alt="JSONArg13.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/17f62567-27ea-1878-5a7a-f0708b8ea562.png">
こうしておくと、スクリプトの引数を指定するときにわかりやすいです。

# まとめ
JSONをスクリプト引数で使うときの便利なところ、ぜひ実感してください。
[JSONSetElement](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help%2Fjsonsetelement.html%23ww1149903),[JSONGetElement](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help%2Fjsongetelement.html%23ww1149541)の２つをセットで覚えてしまえば、スクリプト引数でkey-value方式の確かなデータの受け渡しができますので、活用してみてくださいね。