FileMaker Advent Calendar 2020 の15日目の記事です。
はじめに
みんな大好きJSON関数。今日はその中のJSONFormatElements関数について考察したいと思います。
JSONFormatElements関数とは
ヘルプページ、JSONFormatElementsによると次のように記載されています。
JSON データ内の要素を読みやすい形に書式設定します。
また、JSON 関数の使い方には
メモ
•JSON パーサは配列内の要素の順序は維持しますが、オブジェクト内の要素の順序は維持しません。そのため、JSON 関数は指定した順序とは異なる順序でオブジェクトの要素を返すことがあります。
と、最下段にメモとして記載があります。これはjson.orgに書かれたJSONの仕様についての記述だと思われます。
要素の順序
さて、ここではパーサと書かれていますが、FileMakerの標準機能でのパーサはJSONFormatElements関数になるでしょう。
JSONの仕様ではオブジェクト内の要素の順番は維持されないとあります。では、JSONFormatElementsではどうでしょうか?
JSON 関数の使い方ページの一例を使って見ていきましょう
配列内の要素
{
"ベーカリー" :
{
"製品" :
[
{
"id" : "FB1",
"名前" : "ドーナツ",
"価格" : 1.99,
"在庫" : 43,
"カテゴリ" : "パン",
"特売" : true
},
{
"id" : "FB3",
"価格" : 3.95,
"名前" : "バゲット",
"在庫" : 34,
"カテゴリ" : "パン",
"特売" : true
},
{
"id" : "FB2",
"価格" : 22.5,
"名前" : "チョコレートケーキ",
"在庫" : 23,
"カテゴリ" : "ケーキ",
"特売" : true
}
]
}
}
※ヘルプページの例とは配列内の順番を変えています
すでに展開された状態ですが、JSONFormatElementsを使って整形します。
{
"ベーカリー" :
{
"製品" :
[
{
"id" : "FB1",
"カテゴリ" : "パン",
"価格" : 1.99,
"名前" : "ドーナツ",
"在庫" : 43,
"特売" : true
},
{
"id" : "FB3",
"カテゴリ" : "パン",
"価格" : 3.95,
"名前" : "バゲット",
"在庫" : 34,
"特売" : true
},
{
"id" : "FB2",
"カテゴリ" : "ケーキ",
"価格" : 22.5,
"名前" : "チョコレートケーキ",
"在庫" : 23,
"特売" : true
}
]
}
}
配列内の要素の順序は維持しますが、
{
{"id" : "FB1"},
{"id" : "FB3"},
{"id" : "FB2"}
}
ご覧のように配列内の順序は維持されています。(他の要素は省略)
オブジェクト内の要素
続いてオブジェクト内の要素も見てみましょう。
オブジェクト内の要素の順序は維持しません。
メモにはこうあります。
{
"id" : "FB1",
"名前" : "ドーナツ",
"価格" : 1.99,
"在庫" : 43,
"カテゴリ" : "パン",
"特売" : true
},
{
"id" : "FB1",
"カテゴリ" : "パン",
"価格" : 1.99,
"名前" : "ドーナツ",
"在庫" : 43,
"特売" : true
},
keyの順序が変わっています。さらに言うと、名前順でソートされているようです。
日本語だとわかりにくいので英語版のヘルプのJSONで見てみましょう。
{
"id" : "FB1",
"name" : "Donuts",
"price": 1.99,
"stock" : 43,
"category" : "Breads",
"special" : true
},
{
"category" : "Breads",
"id" : "FB1",
"name" : "Donuts",
"price" : 1.99,
"special" : true,
"stock" : 43
}
アルファベット順にソートされていますね。
まとめ
FileMakerのJSONFormatElements関数では、オブジェクト内の要素の順序はKeyの名前順でソートされると考えてよさそうです。
ただ、ヘルプに記載があるわけではないのでいつ仕様がかわるかはわかりませんが……(ソートされるの前提で書いたスクリプトがあるから変更されないでほしいな〜〜)
以上、ヘルプにはないJSONFormatElements関数の考察でした。
なんて書いたけど巷では常識だったりして……