JSON関数について
JSONの使いどころ
主に辞書型の変数を再現したり、外部連携などに使用する。例えば以下の場合。
・スクリプト引数を複数にする
・名前付きの変数を疑似的に再現できる(集計などで便利)
・APIの戻り値を処理する
・Webビューアのjavascriptにパラメータを渡す
使用例
レイアウトの移動を記録し、前のレイアウトに戻るスクリプトをJSON関数を使って作成してみた。複数段階戻ることができるようになっている。
改行区切りリストでも可能だが、JSONを使うことでウインドウごとに記録が可能。
スクリプト:レイアウト記録
#レイアウト移動時、レイアウト名を記録
#前のレイアウトに戻るために使用
#OnLayoutExitスクリプトトリガで使用
#引数:なし
#戻り値:なし
#※グローバル変数を使用
#JSON構造
#{
# "ウインドウ名":["レイアウト名","レイアウト名","レイアウト名"],
# "ウインドウ名":["レイアウト名"]
#}
エラー処理 [ オン ]
ウインドウの固定
変数を設定 [ $windowName; 値:Get ( ウインドウ名 ) ]
#JSONキーに使用不能な文字をエスケープ
変数を設定 [ $windowKey; 値:Substitute ( $windowName ; [ "." ; "_" ] ; [ "[" ; "<" ] ; [ "]" ; ">" ] ) ]
変数を設定 [ $layoutName; 値:Get ( レイアウト名 ) ]
変数を設定 [ $json; 値:$$PREV_LAYOUT ]
If [ Left ( JSONFormatElements ( $json ) ; 1 ) = "?" ]
#無効なJSONの場合はリセット
変数を設定 [ $json; 値:"{}" ]
End If
変数を設定 [ $keyIndex; 値:ValueCount ( JSONListKeys ( $json ; $windowKey ) ) ]
変数を設定 [ $key; 値:$windowKey & "[" & $keyIndex & "]" ]
変数を設定 [ $prevKey; 値:$windowKey & "[" & ( $keyIndex - 1 ) & "]" ]
#現在のレイアウトをセット
#最後の値に現レイアウトが既にセットされている場合はパス
If [ JSONGetElement ( $json ; $prevKey ) ≠ $layoutName ]
変数を設定 [ $json; 値:JSONSetElement ( $json ; $key ; $layoutName ; JSONString ) ]
変数を設定 [ $$PREV_LAYOUT; 値:JSONFormatElements ( $json ) ]
End If
スクリプト:レイアウト戻る
#前のレイアウトに戻る
#変数にレイアウト名を記録している必要がある
#引数:なし
#戻り値:なし
#※グローバル変数を使用
#JSON構造
#{
# "ウインドウ名":["レイアウト名","レイアウト名","レイアウト名"],
# "ウインドウ名":["レイアウト名"]
#}
エラー処理 [ オン ]
ウインドウの固定
変数を設定 [ $windowName; 値:Get ( ウインドウ名 ) ]
#JSONキーに使用不能な文字をエスケープ
変数を設定 [ $windowKey; 値:Substitute ( $windowName ; [ "." ; "_" ] ; [ "[" ; "<" ] ; [ "]" ; ">" ] ) ]
変数を設定 [ $currentLayout; 値:Get ( レイアウト名 ) ]
変数を設定 [ $json; 値:$$PREV_LAYOUT ]
If [ Left ( JSONFormatElements ( $json ) ; 1 ) = "?" ]
#無効なJSONの場合はリセット
変数を設定 [ $json; 値:"{}" ]
End If
変数を設定 [ $keyIndex; 値:ValueCount ( JSONListKeys ( $json ; $windowKey ) ) - 1 ]
#配列の最後の値を取り出す
変数を設定 [ $key; 値:$windowKey & "[" & $keyIndex & "]" ]
変数を設定 [ $targetLayout; 値:JSONGetElement ( $json ; $key ) ]
変数を設定 [ $json; 値:JSONDeleteElement ( $json ; $key ) ]
#取り出した値が現在のレイアウトと同じなら、次を取り出す
If [ $targetLayout = $currentLayout ]
変数を設定 [ $key; 値:$windowKey & "[" & ( $keyIndex - 1 ) & "]" ]
変数を設定 [ $targetLayout; 値:JSONGetElement ( $json ; $key ) ]
変数を設定 [ $json; 値:JSONDeleteElement ( $json ; $key ) ]
End If
変数を設定 [ $$PREV_LAYOUT; 値:JSONFormatElements ( $json ) ]
レイアウト切り替え [ $targetLayout ]
JSON関数を使う際の注意事項
・JSON関数はFileMaker16から。15以前では使えない
・Runtimeソリューションでは使用不可
・JSON内のそれぞれのキーに「.」や「[」が含まれている場合、正しく動作しない(キーの指定方法と競合するため)
・オブジェクトであれば「.」で、配列であれば「[ ]」でキーをつなげる必要がある(キーの結合方法を使い分ける必要がある)
・JSON配列の最後尾に要素を追加する場合、配列の要素数を数え上げてインデックスを指定する必要がある(一発で最後尾に追加する方法が存在しない)
・関数でエラーが出た場合(正常なJSONでない場合など)はエラー文字列が帰ってくるため、そのまま処理が進んでしまわないよう注意。正常なJSONでないものは、以下の式でチェックできるLeft ( JSONFormatelements ( $json ) ; 1 ) = "?"
・空の文字列「””」にJSONListKeysなどを使った場合、エラーが出る。上述の式でチェックし、エラーであれば「”{}”」(空のJSON)に置き換えると良い
投稿者プロフィール
-
スモールの未来探究部 所属
FileMaker開発エンジニア
最新の投稿
- FileMaker研究室2024年2月8日FileMaker WebDirectでアクセス時に発生する502エラーの解決方法
- FileMaker研究室2023年12月19日Webビューアで特定の座標のGoogleMapを表示
- FileMaker研究室2023年8月19日FelicaのIDmを取得する方法の模索
- FileMaker研究室2022年11月25日AWSでの環境構築録