JSON 基礎 から 応用まで

JSON ? ん〜 いまいち よくわからない?という方へ

Claris FileMaker では、
バージョン16から JSON を簡単に扱える関数が実装されました。
公式や非公式含めたくさんのブログやYoutubeで解説されています。

それでも、JSON っていまいち よくわからない、
という方がいまだに多くいらっしゃいます。
本投稿ではそもそも JSON とはなんなのかを、
私なりに説明してみたいと思います。

構造化データのあれこれ

複数の情報を一度にやり取りする時に構造化データにすると便利です。
そんなときに CSV は構造化データの代表的な1種です。
そして JSON も構造化データの1種です。
また、FileMaker では改行区切りデータも構造化データとして利用することが多いです。

たとえば、
所属は10、職種は5、名前は若林
というデータをそれぞれの構造化データで示すと次のようになります。

「CSV」

CSVは国際標準規格が複数存在し、例外のパターンがいくつも存在(乱立)していますが、
一般的には、1行目に列の名前をカンマ区切りで、
2行目以降は、その列名の順番に合わせてデータをカンマ区切りで入れていきます。

データ内に改行やカンマが入る時や、
列の順番変更や間の列を省略できない、
などが CSV の使いにくいところです。

「改行区切り」

国際標準ルールなんてものはなく、
1行目は所属、2行目は職種、3行目は名前、と別途管理し、
利用するシステム内で統一して使います。

こちらも、データ内に改行が入る時や、
行の順番変更や間の行を省略できない、
などが 改行区切り の使いにくいところです。

「JSON」

データのまとまりは オブジェクトとして {} で囲み、
その中に "key":"value" のセットをカンマ区切りで入れます。
valueが文字列ではない場合はダブルコーテーションなしに "key":value のセットにします。

CSV などのように、
データ内にカンマやダブルコーテーションが入ったらどうするんだ?
という問題は JSON にも存在します。
ただし、JSON には国際標準ルールが統一されており、
誰が作っても問題なく値を取り出すことができるようになっています。

そしてある時は、"key":"value" のセットとして職種がない とか、
あるときは、他のオブジェクトにはない "年齢":23 という"key":"value"が入っていても構いません。
{"所属":10,"名前":"若林","職種":5} でも、 {"職種":5,"名前":"若林","所属":10} などオブジェクトの中では順番が入れ替わっても構いません。
構造化データなのにとても柔軟性が高いのも JSON の良いところです。

そして、JSON を簡単に扱うための標準関数が、
FileMaker だけでなくほとんどの開発言語にあるので、
今の所構造化データといえば JSON 形式が人気になっています。

JSON の構造の詳細

所属は10、職種は5、名前は若林
というデータを JSON で記述するルールを書きましたが、
もう少し詳細をお伝えします。

「オブジェクト」

"key":"value" の value にダブルコーテーションやバックスラッシュがある場合は、
バックスラッシュでエスケープします。
例えば value が
若”林\孝
の場合は次のようになります。
{"名前":"若\"林\\孝"}

また value に改行とかタブが入る場合は、
それぞれの記号に置き換えします。
例えば value が(改行はLFを想定)


の場合は次のようになります。
{"名前":"若\n孝"}

FileMaker やそれぞれの開発言語の標準関数を使うことで、
開発者は上記のような文字の置換をしなくても、
関数が自動的にやってくれるので楽です。

「配列」

複数の値を示す場合は、配列を使用します。
配列を示す [] 内に、カンマ区切りで value を入れます。
[ value , value , value ]

たとえば次のようなCSVのとき、

所属,職種,名前
10,5,若林
10,9,木村
20,7,山下

JSON では次のようになります。

[{"所属":10,"職種":5,"名前":"若林"},{"所属":10,"職種":9,"名前":"木村"},{"所属":20,"職種":7,"名前":"山下"}]

「value は値だけでなく、オブジェクト、配列 もOK」

上記の JSON の例もそうでしたが、
JSON の基本である "key":"value""value" は、
値だけじゃなく、オブジェクト、配列を入れても構いません。

例えば、
{"key1":{"key11":[value110,value111],"key12":value12},"key2":value2}
のように何階層にも入れ子にすることができます。

「整形するための空白文字」

key と value の中身以外は、
改行やスペースやタブを入れて整形してもデータに影響はありません。
上記の入れ子にした JSON を整形して次のようにしても構いません。

JSONGetElement 関数を使った JSON データから値の取り出し

上記のような JSON は FileMaker でよくある形です。
ここから次のような引数で値を取り出すことができます。

"[1]"{"所属":20,"職種":7,"名前":"山下"}
"[0].職種"5

注意事項としては、配列の場合の一番最初の番地は 0 になる点をお忘れなく。
もし上記の JSON データが 変数 $A に入っていた場合、
FileMaker の関数に次のような記述をすることで値を取り出すことができます。

JSONGetElement ( $A ; "[1]" ){"所属":20,"職種":7,"名前":"山下"}
JSONGetElement ( $A ; "[0].職種" )5

JSONSetElement 関数を使った JSON データへの値の設定

JSONSetElement 関数を使って上記の JSON を作る場合
さまざま書き方があります。
次の2つの方法というか考え方を理解しておくと良いと思います。

JSONSetElement ( ""
; [ "[0].所属" ; 10 ; JSONNumber ]
; [ "[0].職種" ; 5 ; JSONNumber ]
; [ "[0].名前" ; "若林" ; JSONString ]
; [ "[1].所属" ; 20 ; JSONNumber ]
; [ "[1].職種" ; 7 ; JSONNumber ]
; [ "[1].名前" ; "山下" ; JSONString ]
)

上記は、それぞれの key を一つ一つ示し、値を設定していく方法です。
JSONSetElement の第2引数以降を、
;[ 第2引数 ; 第3引数 ; 第4引数  ] でいくつでも設定することができます。

JSONSetElement ( ""
; [   "[0]"
    ; JSONSetElement ( ""
        ; [ "所属" ; 10 ; JSONNumber ]
        ; [ "職種" ; 5 ; JSONNumber ]
        ; [ "名前" ; "若林" ; JSONString ] )
    ; JSONObject ]
; [   "[1]"
    ; JSONSetElement ( ""
        ; [ "所属" ; 20 ; JSONNumber ]
        ; [ "職種" ; 7 ; JSONNumber ]
        ; [ "名前" ; "山下" ; JSONString ] )
    ; JSONObject ]
)

上記は、オブジェクトを JSONSetElement で作成し、
それぞれの結果を JSONSetElement で各配列に入れる記法です。

このように作りたい JSON は同じでも、
JSONSetElement の書き方は何通りもあります。
自分の定型的なパターンを身につけるといいでしょう。

応用 NoSQL の世界へ

ここからは応用です。

NoSQL という言葉を聞いたことはありませんか?
JSON を主にデータベース化していく考え方です。
例えば次のような CSV の構造化データがあったときに、
テーブルとフィールドで管理する FileMaker や SQL データベースであれば、
ほぼ見た目のままのフィールド(カラム)とレコードがイメージできると思います。

所属,職種,名前
10,5,若林
10,9,木村
20,7,山下

それに対して、NoSQL の世界では、
JSON で格納していきます。
まずはこれまでご説明した通り次のような JSON を保存します。

[
 {"所属":10,"職種":5,"名前":"若林"},
 {"所属":10,"職種":9,"名前":"木村"},
 {"所属":10,"職種":5,"名前":"山下"}
]

しかしこれでは、「山下の職種」を調べたいとなると、
Loop を回さないとわかりませんが、
次のような JSON だったらすぐ取り出せます。

{
 "若林":{"所属":10,"職種":5},
 "木村":{"所属":10,"職種":9},
 "山下":{"所属":10,"職種":5}
}

と JSON データを保存しておけば、

JSONGetElement ( $json ; "山下.職種" )

ですぐ取り出せます。

同様に、「所属が 10 の人の情報」を集めろ と言われる可能性が高いなら、
次のような JSON だったらすぐ取り出せます。
こちらも格納している情報になんら変わりありませんが、
JSON の構造は大きく変わっています。

{
 "所属10":[
    {"若林":5},
    {"木村":9}],
 "所属20":[
    {"山下":7}]
}

このように、JSON の構造に答えはなく、
取り出しやすい JSON 構造を複数保存していくのが NoSQL の世界です。

この考え方は FileMaker で JSON を作成するときにも有効です。
JSONSetElement などで JSON を作成するときには、
JSONGetElement しやすい JSON を作ることで、
記述する計算式やスクリプトステップも削減でき、
高速化にも寄与します。
頭の片隅にでも入れておいてください。

 

【 余談 】
最近下記リンク先への流入増大したいこともあり、
流入量が多いとブログの価値が高まりますます投稿を加速していきたいと思います。
リンク先を開いていただけると大変助かります。
Claris International Inc. (日本語)
ご協力いただけましたら幸いです。