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)に置き換えると良い