new!!
>JSON 関数の意外な使い方
FileMaker Pro 16 より、外部ソースの JSON データを FileMaker ソリューションで解析および変更できるようにする [JSON] 関数が採用されました。
16以前のバージョンでも、[URL から挿入] スクリプトステップより、WEBサービスから受けた JSON 形式の結果をパースして FileMaker 内で利用するという方法はあったのですが、カスタム関数を駆使したり、テキスト関数で切って刻んでと、なかなかの手間だっただけに、今回の標準採用でかなりパースの闇は解消され、活発な連携事例が増えると期待できます。
ただ、今回採用されたJSON関数で、筆者が密かに期待したのは、
[JSONSetElement] 関数
が、FileMaker 内のデータを JSON 配列形式で整形できるというところ。
ちなみに、
JSONSetElement ( $$json ;
["id" ; "S_001" ; JSONString];
["商品名" ; "りんご" ; JSONString]
)
と書くと、
$$json の答えは
{"id":"S_001","商品名":"りんご"}
と整形されて返ってくる。
また、上の $$json に対して、
JSONGetElement関数を使って
JSONGetElement ( $$json ; "商品名" )
と書くと、
答えは
りんご
と返ってくる。
どこかで見たこの形、そう、Dictionary 関数と同じ結果なのです。
Dictionary 関数はカスタム関数である為、初めて聞いたという方もいらっしゃると思いますが、
↓のURLにて Bison さんが紹介してくれているので是非ご参照いただきたい。
Dictionary 関数を簡単に説明すると、
1つのテキストデータの中に、複数のデータペア(ラベル名+値)を所持することができる、
いわゆる 連想配列 というデータ構造をFileMakerで実現する為の関数です。
>連想配列による引数渡し
連想配列と言っても、普通に FileMaker 開発をしている上では、なかなか使うシチュエーションに出会わないのですが、
モジュール化されたサブスクリプトに、複数のパラメータを引数で渡して、TOに依存せず、いつでも同じ結果を求めたい(DRY)というのは開発を追求していくと必ず出てくる欲求の1つであり、
連想配列が一番活躍する場面と思われます。
一般的に、複数のパラメータを引数で渡す場合は、
"S_001 ¶ りんご"
という形で引数で渡し、
サブスクリプト側で
$ID = GetValue ( Get ( スクリプト引数 ) ; 1 )
$商品名 = GetValue ( Get ( スクリプト引数 ) ; 2 )
と、行数を指定して受けとるという手法が取られますが、
これを、
$ID = JSONGetElement ( Get ( スクリプト引数 ) ; "id" )
$商品名 = JSONGetElement ( Get ( スクリプト引数 ) ; "商品名" )
とラベル名で指定して取得できるので、
仮にパラメータが増えて改行位置が変わったとしても、値を正確に受け取ることができます!
また、ここからが一番重要なのですが、
"S_001 ¶ りんご ¶ 産地直送、
お早めにお召し上がり下さい "
と、元々改行が含まれている値を引数で受け渡す場合は、
行指定しかできない [GetValue] 関数では正確に値を取り出すことができないという問題に直面します。
※値の中の改行により意図しない改行数になる為。
ただし、[JSONSetElement] 関数で連想配列を組むと
{"id":"S_001","商品名":"りんご","紹介文":"産地直送、\rお早めにお召し上がり下さい"}
と改行コードが自動的にエスケープされてデータ化され、
$紹介文 = JSONGetElement ( Get ( スクリプト引数 ) ; "紹介文" )
とすることで、綺麗に改行が復元されてデータを受け取ることができます!すごい。
改行を気にせず引数として渡せるというのは、FileMaker 開発者にとってみると
なんとも気が楽でありがたく、いつの間にか、引数は Dictionary 関数で書くようになっていた
という人も何人か知っています。(やり過ぎ注意)
>実際の活用例
弊社ではこれまで Dictionary 関数を下記のシチュエーションで使ってきました。
・メールサブスクリプトへの引数渡し(toやbodyなど)
・ログ取得サブスクリプトへの引数渡し(TO名やログ内容)
・ログインユーザー権限のグローバル保持(権限名とその有無)
・レイアウト上の全フィールド内容の取得(フィールド名と値)
などなど
また機会があれば紹介したいと思います。
>まとめ
実際に、開発の中で JSON 関数を Dictionary 関数の要領で使ってみた所、いとも簡単に代用することが出来ました。
[JSONSetElement] 関数にはまだまだ引数やグルーピングの手法があるので、もっと様々な利用法が出てくるように思われます。
FileMaker 内部でこの関数を利用することが想定されていたかどうかは分かりませんが、標準関数で連想配列のようなデータ構造が作れるのは大変ありがたいですね。
※注意
実は JSON 関数はランタイムソリューションでは使えないそうですので、注意が必要です。
※この記事はシリーズです まとめページはこちら
Comments