🐱

ブルボンのお菓子で学ぶFileMakerのJSONSetElement

6 min read

はじめに

FileMakerでJSONオブジェクトを記述する際は、

  • ダイレクトに記述する
  • JSONSetElement関数を使用して記述する

このどちらかになると思いますが、前者の場合、ルールを十分に理解さえしていれば記述が速いので、実際にそうされている方も多いでしょう。

問題は後者の場合です。

そもそもの公式ヘルプからして言葉足らずと思われる部分も多く、何をどうしたらどのようなJSONが組みあがるのか、といった理解が難しいです。

そこで、JSONSetElement関数に慣れていない人向けに、記事を書いてみました。
最終的に目指すのは、公式サイトヘルプにあるJSONデータの例のような形です。


キー(key)と値(value)の作成

計算式

JSONSetElement ( "" ;
		[ "お菓子" ; "アルフォート" ; JSONString ]	
 )

計算結果

{"お菓子":"アルフォート"}

まずは、これがJSONオブジェクトの作成の仕方であり、また結果の基本形です。
コロン(:)を境にして「お菓子」というキーと、そのキーに紐づく「アルフォート」という値がワンセットになった計算結果が返ってきます。

お菓子と言えばアルフォートです

ということを意味します。

計算式の一行目、

JSONSetElement ( "" ;

新規でJSONオブジェクトを組み上げる際は、このように空("")にします("{}"でも可)。ここはいわゆる引数に当たる部分で、例えば既存のJSONオブジェクトにキーと値を追加していきたい場合には、ここにその既存JSONを設定しますが今回は詳細を省きます。

※既存のJSONオブジェクトに追加する例

JSONSetElement ( $existJSON ;
	[ "アイス" ; "ロアンヌアイス" ; JSONString ]	
 )

JSONFormatElements

さて、計算結果がやや見辛いので、

JSONFormatElements ( 
	JSONSetElement ( "" ;
		[ "お菓子" ; "アルフォート" ; JSONString ]	
	 )
 )

と、JSONFormatElements関数で囲んでみます。こうすることで、

{
	"お菓子" : "アルフォート"
}

と、計算結果が可読しやすくなりますので、以降、本記事での計算結果はJSONFormatElements関数を当てたものを記載していきます。

注意点として、何らかの外部と通信を行う際(例えばAPI)、JSONFormatElements関数を当てたJSONオブジェクトを送信するとエラーになるケースが多々あります。ですので、あくまでも可読性の為に当てるに留めた方が良いです。

話を戻し、計算式の三行目、

[ "お菓子" ; "アルフォート" ; JSONString ]

最後にJSONStringと記述してあるのは、ここで値のタイプを指定しています。JSONStringと指定することで、キーである"お菓子"に"アルフォート"という値をテキストデータとして紐づけるという意味になります。

次に、製造者も加えてみます。

計算式

JSONSetElement ( "" ;
		[ "お菓子" ; "アルフォート" ; JSONString ];
		[ "製造者" ; "ブルボン" ; JSONString ]
 )

計算結果

{
	"お菓子" : "アルフォート",
	"製造者" : "ブルボン"
}

新たなキーと、その値が追加されました。

さらに、法人番号も加えてみます。

計算式

JSONSetElement ( "" ;
		[ "お菓子" ; "アルフォート" ; JSONString ];
		[ "製造者" ; "ブルボン" ; JSONString ];
		[ "法人番号" ; 6110001017563 ; JSONNumber ]
 )

計算結果

{
	"お菓子" : "アルフォート",
	"法人番号" : 6110001017563,
	"製造者" : "ブルボン"
}

法人番号は数字ですから、

[ "法人番号" ; 6110001017563 ; JSONNumber ]

という風に値のタイプをJSONNumberとしています。これは値を数字データとして紐づける意味になります。
※数字データとする場合は、値を""(ダブルクォーテーション)で括ってはいけません。


ピリオド(.)による入れ子

実際は、アルフォートはあくまでもチョコレートの一部であり、ブルボンではチョコレート以外にも色んな種類のお菓子を取り扱っています。

豆菓子、グミ、スナック、ビスケット...etc

では、この種類をお菓子のところに組み込んでみます。

計算式

JSONSetElement ( "" ;
		[ "お菓子.チョコレート" ; "" ; JSONString ];
		[ "お菓子.豆菓子" ; "" ; JSONString ];
		[ "製造者" ; "ブルボン" ; JSONString ];
		[ "法人番号" ; 6110001017563 ; JSONNumber ]
 )

計算結果

{
	"お菓子" : 
	{
		"チョコレート" : "",
		"豆菓子" : ""
	},
	"法人番号" : 6110001017563,
	"製造者" : "ブルボン"
}

ここが、階層構造を理解する上で非常に大事なところです。

[ "お菓子.チョコレート" ; "" ; JSONString ]

このようにキーに.(ピリオド)を使うことで、お菓子(キー)の値として、新たに {}(オブジェクト)を設定していくことができます。いわゆる入れ子です。

注意点として、実際にやってみると分かりますが、

[ "お菓子." ; "" ; JSONString ]

では何も変化はありません。必ず.(ピリオド)に続けてキー(今回の例で言うと「チョコレート」や「豆菓子」)が必要です。

計算結果の3行目~6行目をよく見ると、

{
       "チョコレート" : "",
       "豆菓子" : ""
}

ここは、まんま一番最初に作成したJSONオブジェクトと同じですね。

では、チョコレート(キー)と豆菓子(キー)に値を設定してみます。

計算式

JSONSetElement ( "" ;
		[ "お菓子.チョコレート" ; "アルフォート" ; JSONString ];
		[ "お菓子.豆菓子" ; "味ごのみ" ; JSONString ];
		[ "製造者" ; "ブルボン" ; JSONString ];
		[ "法人番号" ; 6110001017563 ; JSONNumber ]
 )

計算結果

{
	"お菓子" : 
	{
		"チョコレート" : "アルフォート",
		"豆菓子" : "味ごのみ"
	},
	"法人番号" : 6110001017563,
	"製造者" : "ブルボン"
}

アルフォートはお菓子オブジェクトの中のチョコレート(キー)の値であり、味ごのみはお菓子オブジェクトの中の豆菓子(キー)の値です。


大括弧([])で配列

チョコレートの商品はアルフォートだけではありません。
さくっとした食感のブランチュールのようなチョコレートもありますので、チョコレートの値を増やしてみます。

計算式

JSONSetElement ( "" ;
		[ "お菓子.チョコレート[0]" ; "アルフォート" ; JSONString ];
		[ "お菓子.チョコレート[1]" ; "ブランチュール" ; JSONString ];
		[ "お菓子.豆菓子" ; "味ごのみ" ; JSONString ];
		[ "製造者" ; "ブルボン" ; JSONString ];
		[ "法人番号" ; 6110001017563 ; JSONNumber ]
 )

計算結果

{
	"お菓子" : 
	{
		"チョコレート" : [ "アルフォート", "ブランチュール" ],
		"豆菓子" : "味ごのみ"
	},
	"法人番号" : 6110001017563,
	"製造者" : "ブルボン"
}

[ ](大括弧)を記述することで、配列を扱うことが可能になります。
配列のイメージとしては繰り返しフィールドが近いでしょうか、値を設定できる箱がたくさん。

計算式の二行目、

[ "お菓子.チョコレート[0]" ; "アルフォート" ; JSONString ]

といった風に[0]といった記述をしていますが、これは配列(値を設定する箱)の0番地を指定したことになります、つまり、

  • チョコレート(キー)の配列0番地の値としてアルフォートを設定

という意味になります。

同じく

[ "お菓子.チョコレート[1]" ; "ブランチュール" ; JSONString ]

これは、

  • チョコレート(キー)の配列1番地の値にブランチュールを設定

ということになります。

ですので、計算結果の4行目

"チョコレート" : [ "アルフォート", "ブランチュール" ]

ここは、チョコレート(キー)の値として[ 配列0番地 , 配列1番地 ]という並びの値を設定しているということになります。

※通常、配列を設定していく場合は0番地から始めます


ピリオド(.)と大括弧([])の併用

チョコレートの商品として、これで色々追加していくことが可能になりそうですが、それぞれの商品は、価格や内容量(重さ)などといった違いがありますので、これも設定してみます。

計算式

JSONSetElement ( "" ;
		[ "お菓子.チョコレート[0].商品名" ; "アルフォート" ; JSONString ];
		[ "お菓子.チョコレート[0].価格" ; "67円" ; JSONString ];
		[ "お菓子.チョコレート[0].内容量" ; "59g" ; JSONString ];
		[ "お菓子.チョコレート[1].商品名" ; "ブランチュール" ; JSONString ];
		[ "お菓子.チョコレート[1].価格" ; "98円" ; JSONString ];
		[ "お菓子.チョコレート[1].内容量" ; "46g" ; JSONString ];
		[ "お菓子.豆菓子" ; "味ごのみ" ; JSONString ];
		[ "製造者" ; "ブルボン" ; JSONString ];
		[ "法人番号" ; 6110001017563 ; JSONNumber ]
 )

計算結果

{
	"お菓子" : 
	{
		"チョコレート" : 
		[
			{
				"価格" : "67円",
				"内容量" : "59g",
				"商品名" : "アルフォート"
			},
			{
				"価格" : "98円",
				"内容量" : "46g",
				"商品名" : "ブランチュール"
			}
		],
		"豆菓子" : "味ごのみ"
	},
	"法人番号" : 6110001017563,
	"製造者" : "ブルボン"
}

ようやく、JSONデータの例の形になりました。

計算式の二行目、

[ "お菓子.チョコレート[0].商品名" ; "アルフォート" ; JSONString ]

[](大括弧)の後に.(ピリオド)を使っていますがこれは

  • チョコレート(キー)の値(配列0番地)として、新たに{}(オブジェクト)を設定する

ということであり、そして、

  • キーは商品名で、その値はアルフォートを設定する

ということになります。
式と結果をよく見比べてみると、見えてくるものがあると思います。


まとめ

階層構造は、{ }オブジェクトや[ ]配列がごちゃごちゃしてても結局のところ、

"◇◇◇":"..."となっている場合は、
⇒ "..."は、◇◇◇(キー)の値

"〇〇〇":{...}となっている場合は、
⇒ {...}は、〇〇〇(キー)のオブジェクトであり、設定にはさらにキーが必要

"△△△":[...]となっている場合は、
⇒ [...]は、△△△(キー)の配列であり、設定には配列番号が必要

ということになります。
これらが入れ子になって複雑に見えるだけですね。JSONGetElementでの値やオブジェクトや配列の取得の場合も同様の事が言えます。


さいごに

解説は以上になりますが、いかがだったでしょうか。
JSONSetElement関数は簡単なオブジェクトを組み上げるだけなら問題ないものの、ちょっと入れ子になったものを組み上げようとすると、慣れていないと本当に苦労すると思います。
そんな時は、ダイレクトに記述していくのも一つの手ですが、JSONSetElement関数でスマートに組み上げたい場合は、本記事を参考にしてみて下さい。

それでは
Let's enjoy FileMaker!

Discussion

ログインするとコメントできます