JSONSetElementで複合データ保存術
FileMakerでシステムを作っていると、「このレコードに関連する細かい情報を、ひとまとめにして持っておきたい」と感じる場面がよくあります。たとえば「見積もりの明細」や「ユーザーごとの設定値」「ログ情報」など、項目数が多かったり、あとから増えそうなデータです。
こうした複雑な情報を、通常のフィールドを増やして対応し続けると、レイアウトやテーブル構造がどんどん複雑になってしまいます。そこで便利なのが、FileMakerのJSON関数、とくにJSONSetElementを使って、1つのフィールドに複合データを整理して保存する方法です。
JSONでデータをまとめて保存する考え方
JSON(ジェイソン)は、もともとWebの世界でよく使われている「データの入れ物」の書き方です。括弧とカンマで、関連する情報をラベル付きで整理して保存できます。
たとえば、顧客の設定情報を、通常のフィールドで管理しようとすると、
- メール配信フラグ
- ポイント残高
- ランク
- 最終ログイン日時
- 通知方法(メール / SMS など)
といったフィールドをテーブルに次々に追加することになります。これが増え続けると、管理も大変ですし、「この設定はどこで持っていたかな?」と探しづらくなります。
そこで、「設定情報」専用のJSONフィールドを1つ作り、その中にまとめて保存します。JSONは「1つのフィールドの中で、複数の項目をラベル付きで持てる箱」と考えるとイメージしやすいでしょう。
JSONSetElementとは何をする関数?
JSONSetElementは、「JSON形式のテキストに、項目を追加・更新する」ための関数です。基本形は次のようになります。
JSONSetElement ( JSON文字列 ; キーまたはパス ; 値 ; 型 )
かんたんに言い換えると、
- どのJSONに(JSON文字列)
- どの項目を(キーまたはパス)
- どんな値で(値)
- どういう種類のデータとして(型)
保存するかを指定する関数です。もとのJSON文字列が空(「””」)でも動作するので、「最初の1件を追加する」ときにもそのまま使えます。
具体例:顧客の設定情報を1フィールドにまとめる
たとえば、顧客テーブルに「設定JSON」というテキストフィールドを1つ用意し、そこに以下の情報をまとめたいとします。
- メール配信:true / false
- ポイント:数値
- ランク:文字列(”gold” など)
この場合、スクリプトや計算式で次のように書けます。
Set Field [ 顧客::設定JSON ;
JSONSetElement (
顧客::設定JSON ;
[ "mail.enabled" ; 1 ; JSONBoolean ] ;
[ "point.balance" ; 1200 ; JSONNumber ] ;
[ "rank" ; "gold" ; JSONString ]
)
]
ここでのポイントは以下の通りです。
顧客::設定JSONに、もともとのJSONを渡すことで、追加・更新どちらにも対応できる"mail.enabled"のような「パス」で、階層付きの名前をつけられるJSONBoolean,JSONNumber,JSONStringでデータの種類を指定できる
このようにして保存しておけば、「設定JSON」の中身は次のようなJSONテキストになります。
{
"mail": {
"enabled": true
},
"point": {
"balance": 1200
},
"rank": "gold"
}
保存したJSONから値を取り出す方法
保存した情報を使うときは、JSONGetElementを使います。たとえば、「この顧客はメール配信を許可しているか?」をチェックするなら、
JSONGetElement ( 顧客::設定JSON ; "mail.enabled" )
と書くことで、true または false が返ってきます。同じようにポイント残高を取り出すには、
JSONGetElement ( 顧客::設定JSON ; "point.balance" )
と指定します。パスのルールさえ統一しておけば、「どこに何が入っているか」が非常に分かりやすくなります。
複数行の明細やリストもJSONで扱える
JSONは「配列」という、複数件のデータを順番に並べる形も扱えます。見積もり明細など、1レコードの中に複数行の情報を持たせたい場合に便利です。
たとえば、次のような明細行を1フィールドで管理したいとします。
- 1行目:商品A、数量2、単価1000
- 2行目:商品B、数量1、単価2000
これをJSONで保存する例は次のようになります。
Set Field [ 見積::明細JSON ;
JSONSetElement (
"" ;
[ "items[0].name" ; "商品A" ; JSONString ] ;
[ "items[0].qty" ; 2 ; JSONNumber ] ;
[ "items[0].price"; 1000 ; JSONNumber ] ;
[ "items[1].name" ; "商品B" ; JSONString ] ;
[ "items[1].qty" ; 1 ; JSONNumber ] ;
[ "items[1].price"; 2000 ; JSONNumber ]
)
]
ここで、items[0] や items[1] のように、配列のインデックス(0から始まる番号)を使うことで、複数行のデータを並べています。のちほど行数が増えた場合も、スクリプトでループしながら JSONSetElement を繰り返すことで、柔軟に明細行を追加していくことができます。
JSONSetElementを使うメリットと注意点
JSONSetElementで複合データを保存するメリットは、主に次の3つです。
- フィールドが増えすぎない:設定や明細など、細かい項目を1フィールドにまとめられる
- あとから項目を増やしやすい:JSONの項目を追加するだけで対応でき、テーブル構造を変更しなくてよい
- 他システムとの連携に強い:Web APIなど、JSONでやりとりする場面でもそのまま使いやすい
一方で、注意点もあります。
- バリデーションや検索は工夫が必要
通常のフィールドと違い、JSONの中身を直接「範囲検索」や「値一覧」で扱うのは向いていません。必要に応じて、スクリプトや計算フィールドで補助するのがおすすめです。 - パスのルールを統一する
"mail.enabled"と書いたり"Mail.Enabled"と書いたりとバラバラにしてしまうと、あとから混乱します。プロジェクト内で、名前付けルールを決めておくと安心です。
まずは小さな用途から試してみよう
いきなり全体をJSON化しようとすると、かえって運用が難しくなることもあります。おすすめは、
- 「ユーザーごとの細かい設定」
- 「ログ情報」や「履歴」
- 「外部システムから受け取った生データの保管」
といった場所から、少しずつJSONSetElementを試してみることです。実際に動かしながら、「どの情報は通常のフィールド」「どの情報はJSONフィールド」と役割分担を決めていくと、バランスよく設計できます。
JSONSetElementを使いこなせるようになると、FileMakerの1レコードの中に、これまでよりもずっと柔軟な「複合データの箱」を持てるようになります。まずは簡単なサンプルフィールドを作り、実際に値を出し入れしながら、感覚をつかんでみてください。