JSONSetElementで複合データ保存術
Tips

JSONSetElementで複合データ保存術

2026年5月19日 admin Tips

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レコードの中に、これまでよりもずっと柔軟な「複合データの箱」を持てるようになります。まずは簡単なサンプルフィールドを作り、実際に値を出し入れしながら、感覚をつかんでみてください。

※ 本稿は、生成AIを使用して執筆しています。重要な内容については、必ずご自身でマニュアル等をご確認ください。