みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Filemaker Pro 19.3.1のリリースノートで
強化された関数
JSON 関数 – JSON 関数内のキーまたは索引またはパス引数でパスがカッコ表記で表現されていればキー名にピリオドを含めることができます。
との記載について、
ピリオドが含まれたキー名のJSONデータを作成したいと思い、
データビューアで下記計算式を試すと、
JSONSetElement ( "";
[ "['レイアウト.応答']"; "test"; JSONString ]
)
? in Json::Value::resolveReference(key, end): requires objectValue
とエラーになります。
これを正しく評価させるには、
JSONSetElement ( "";
[ ".['レイアウト.応答']"; "test"; JSONString ]
)
{"レイアウト.応答":"test"}
あるいは、
JSONSetElement ( "{}";
[ "['レイアウト.応答']"; "test"; JSONString ]
)
{"レイアウト.応答":"test"}
とする必要があります。
ヘルプを見ても、JSONSetElementで初期値として入力するのは、
"{}"
の方にするのがよいと思ったのですが、
これでルートが配列になっているデータにしようとすると、
JSONSetElement ( "{}";
[ "[0]['レイアウト.応答']"; "test"; JSONString ]
)
? in Json::Value::operator[](ArrayIndex): requires arrayValue
となり、この場合はエラーが出ます。
JSONSetElement ( "";
[ "[0]['レイアウト.応答']"; "test"; JSONString ]
)
[{"レイアウト.応答":"test"}]
こちらの方では意図した結果になります。
''{}'
の方では、意図した結果を得る方法は見つかりませんでした。
皆さんの意見を伺いたいのですが、
JSONSetElementで、空白データにデータをセットしていく場合、
初期値として、
""と"{}"
のどちらがよい、との見解はありますでしょうか?
私自身は、上記挙動から汎用性を考えて、""を選択しようかと思っております。
皆さんの意見を教えてください。
Last edited by 37 (2021-08-17 21:03:33)
Offline
JSONSetElement ( "{}";
[ "['a.b']"; "test"; JSONString ]
)
JSONオブジェクトかJSON配列か明確にした方が良く無いですか?
ヘルプには、
json 引数が空白 ("") である場合は、キーまたは索引またはパス引数の最初の部分が "[" 文字ではじまっていない限り、値を JSON オブジェクトに追加します (中カッコ { } で囲む)。
と書いてありますから、新規に導入された書式は関係なく、パスの最初の文字を見てオブジェクトか配列か決めてしまうということでしょう。
結果をどっちにしたいのかわかっている状況では、あえて””にする理由はないでしょう。
ルートが配列になっているデータにしようとする
この場合に初期値を"{}"=オブジェクトにしているのは、無理があるのでは。オブジェクト全体を配列に書き換える方法があるかどうかはわかりませんが、全体を書き換えるならゼロから作ればいいんで初期値を指定する意味がないですよね。
指定された JSON データ内の要素を追加または変更します
となっているので、「データ内」しか変更できないのだと思います。
42さん、himadaneeさん
ご意見ありがとうございました。
ヘルプは見ていたはずなのですが、意識を持って読まないと、意味が理解できていないことがよく分かりました(汗)。
仕様としてそうなっているなら、安心して空白("")を用いることもできますし、JSONオブジェクトか、JSON配列かを明確化するとの要素も、よく分かりました。
一応、下記のようなカスタム関数を考えており、ここでの引数としてキーが空白が指定されても、
エラーにならないで欲しく、その手法に迷っておりました。
仕様が分かれば、キーの最初の文字を判別して処理を分ける方法もあったのだと思うのですが、
それよりは下記例の方がシンプルかと思っております。
// JSONPushElementToArray ( %JSON; %key; %value; %type )
// Purpose
// JSON内の該当する配列にpushさせる(新しい値を最後に付け加える)。
// Parameter
// %key: 配列が格納されているJSONキー。
// %value: Pushするデータ。
// %type: PushするデータのJSONタイプ。
Let ( [
%JSON = If ( Exact ( %JSON; "{}" ) or Exact ( %JSON; "[]" );
"";
%JSON
);
%key = If ( Exact ( Left ( %key; 2 ); "['" );
"." & %key;
%key
);
%last = If ( IsEmpty ( %JSON );
0;
ValueCount ( JSONListKeys ( %JSON; %key ) )
)
];
JSONSetElement ( %JSON;
%key & "[" & %last & "]"; %value; %type
)
)
Last edited by 37 (2021-08-20 13:39:02)
Offline
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 512.27 KiB (Peak: 516.8 KiB) ]