最近は、FileMakerの開発で構造化されたデータを受け渡す場合にはJSONを使うのが当たり前になりつつあるようです。今回はJSONオブジェクトの作り方に関するAppWorksの入門記事を紹介します。
Step-by-Step Guide to Building a JSON Object in FileMaker
(元記事はこちら)
David Weiner
2019/8/23
JSONは、FileMaker開発者がデータをメモリ上に保持したり操作するときの標準的な手法になりました。言い換えれば、単純な文字列、数値、改行区切りのリストよりも複雑なものを、変数を作成して格納する場合は、JSONを使うことをお勧めします。まだ使用していないあなたは、その方法をぜひ学びましょう!
最初の一歩を踏み出すのには勇気が要るかもしれませんので、分解して説明します。バージョン16でJSON関連の機能が初めて導入されたとき、 JSONを使用して複数の引数を渡すときの基本(basics of passing multiple parameters using JSON)という記事を書きましたが、JSONはFileMakerでそれ以上のことにも活用できます。JSONは、構造化されたデータを簡単にアクセスできる形で保存するために使用するとき、その威力を発揮します。今回は、FileMakerのレコードをJSONとして保存し、スクリプトを使用して必要なデータを抽出する方法を紹介します。
FileMakerのAdvancedモードで使用できる機能であるData Viewerを使用して、これらすべての手順をテストできます。ぜひ実際に手を動かして試してみてください。
ステップ1 − 基本的なオブジェクトを作成する
FileMakerでJSONを組み立てるために使用する基本的な関数が、JSONSetElementです。データビューアは、JSONSetElementと入力し始めるだけ、以下の内容を自動的に補完してくれます。
JSONSetElement ( json ; キーまたは索引またはパス ; 値 ; タイプ )
すべての引数を実際のものに置き換える必要があります。
- 「json」を単に2つの二重引用符(“”)に変更します。これが空のJSONオブジェクトを生成します
- 「キーまたは索引またはパス」を、引用符付きの”firstName”に変更します。これがキーと呼ばれるものです
- 「値」を引用符付きの実際の名前”David”に変更します。これが「キー」に対する「値」になります
- 「タイプ」を”JSONString”に変更します。あるいは空の二重引用符””にして、値がどのようなデータであるかをFileMakerに自動的に認識させることもできます。
おめでとうございます。これで簡単なJSONオブジェクトを生成できました。これは次のように評価されるはずです。
{"firstName":"David"}
これは、このJSONオブジェクト(波括弧{}内のすべて)において、keyの”firstName”がvalueの”David”に等しいことを意味します。FileMakerの用語で言うと、「オブジェクト」はレコード、keyはフィールド名、valueはフィールドの内容を指します。
このオブジェクトは人物を表すため、”person”というオブジェクトの中に入れるのがいいでしょう。以下のようにコードを微調整します。
JSONSetElement ( "" ; "person.firstName" ; "David" ; JSONString )
すると、次のようなJSONオブジェクトが生成されます。
{"person":{"firstName":"David"}}
ステップ2 − フィールドを追加する
これで「レコード」をJSON形式で作れるようになります。先ほど作成したJSON関数を使用して、2, 3, 4番目の引数を次のように角かっこ[]で囲みます。
JSONSetElement ( “” ; [ “person.firstName” ; “David” ; JSONString ] )
もう一つフィールドを追加してみましょう。今回はkeyが”lastName”、valueがあなたの姓になります。これをJSONオブジェクトにもう一つの「フィールド」として追加するために、2番目の角かっこ[]の後にセミコロンを追加してから、以下のように最初のフィールドの構造を複製します(読みやすいように、改行とタブを追加しています)。
JSONSetElement ( “” ;
[ “person.firstName” ; “David” ; JSONString ] ;
[ “person.lastName” ; “Weiner” ; JSONString ]
)
必要な数のキー(つまりフィールド)を好きなだけ追加できます。
JSONSetElement ( “” ;
[ “person.firstName” ; “David” ; JSONString ] ;
[ “person.lastName” ; “Weiner” ; JSONString ] ;
[ “person.age” ; 49 ; JSONNumber ] ;
[ “person.phone” ; “(503)616-9422” ; JSONString ] ;
[ “person.extension” ; 3 ; JSONNumber ] ;
[ “person.hasPets” ; False ; JSONBoolean ]
)
このコードから、以下のJSONが生成されます。
{"person":{"age":49,"extension":3,"firstName":"David","hasPets":false,"lastName":"Weiner","phone":"(503)616-9422"}}
また、コードの全体をJSONFormatElements関数で囲むと、見栄えを良くすることができます。ただしこれによって内容が変わることはありません。表示方法が変わるだけです。
JSONFormatElements ( あなたのJSONSetElementを使ったコード )
の結果は以下のようになります。
{ "person" : { "age" : 49, "extension" : 3, "firstName" : "David", "hasPets" : false, "lastName" : "Weiner", "phone" : "(503)616-9422" } }
personオブジェクト内のキーがアルファベット順になっていることに注意してください。これは少し混乱するかもしれませんが、そういうものだと理解してください。また、これがオブジェクト内のオブジェクトであることにも注意してください。JSONオブジェクトは{波括弧}で囲まれています。これが次のステップにつながります…
ステップ3 − レコードを追加する
このJSONにもう一人分のレコードを追加したいとします。 JSONでレコードの配列の収集を開始する場合、通常はそれを変数に保持します。そこで$jsonという変数を準備し、そこに前のステップで作ったデータが含まれているとしましょう。実際には、personオブジェクト内にレコードの配列(今回は単なるリスト)を配置する必要があります。配列はJSONオブジェクトのリストで、各オブジェクトには一連のフィールドが含まれています。先ほどのコードを調整して配列を生成するように変更します。
JSONSetElement ( “” ;
[ “person[0].firstName” ; “David” ; JSONString ] ;
[ “person[0].lastName” ; “Weiner” ; JSONString ] ;
[ “person[0].age” ; 49 ; JSONNumber ] ;
[ “person[0].phone” ; “(503)616-9422” ; JSONString ] ;
[ “person[0].extension” ; 3 ; JSONNumber ] ;
[ “person[0].hasPets” ; False ; JSONBoolean ]
)
このコードは、personオブジェクト内の配列の最初の位置に、すべての情報を設定するように関数に指示しています。JSONのインデックスは0始まりなので、最初の位置はインデックス[0]、次が[1]、[2]と続きます。結果は次のとおりです(配列を示す角かっこ[]に注意してください)。
{ "person" : [ { "age" : 49, "extension" : 3, "firstName" : "David", "hasPets" : false, "lastName" : "Weiner", "phone" : "(503)616-9422" } ] }
これで、次のインデックス番号を参照することにより、$json変数のperson配列内に新しい項目を挿入できます。
JSONSetElement ( $json ;
[ “person[1].firstName” ; “Kimberly” ; JSONString ] ;
[ “person[1].lastName” ; “Carlson” ; JSONString ] ;
[ “person[1].phone” ; “(503)616-9422” ; JSONString ] ;
[ “person[1].extension” ; 2 ; JSONNumber ] ;
[ “person[1].hasPets” ; True ; JSONBoolean ]
)
結果は以下のようになります。
{ "person" : [ { "age" : 49, "extension" : 3, "firstName" : "David", "hasPets" : false, "lastName" : "Weiner", "phone" : "(503)616-9422" }, { "extension" : 2, "firstName" : "Kimberly", "hasPets" : true, "lastName" : "Carlson", "phone" : "(503)616-9422" } ] }
これで、JSON配列に2つのレコードができました。基本的な手順は以上です。必要な数だけ続けてレコードを追加することができます。配列の中にさらに配列を作成することもできます。そのあとはJSONGetElement関数を使って、以下のように個々の項目を引き出すことができます。
JSONGetElement ( $json ; "person[1].firstName" )
私は日常的にこの手法を使って、対象レコードをループして各レコードからデータの一部を引き出して、配列に格納しています。その後で、自由に別のコンテキストに移動して、配列から要素を取り出して、別の場所に配置するか、エクスポートすることもできます。これを活用する方法はいくつでもあります。あなた自身の活用方法をぜひ考えてみてください。