やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3学習 JSON拡張(json_set)

 指定したJSONの指定したJSONパスへ、指定した値を代入する。

成果物

json_set()

 ターミナルで以下コマンドを実行する。

sqlite3

 対話モードにて以下コマンドをコピペし実行。

object

select json_set('{"a":1}', '$.a', 2);
{"a":2}
  • キーは第二引数の末尾で指定せねばならない
  • バリューは第三引数で指定せねばならない

 指定したキーが存在しないときは追加する。json_set()=json_insert()+json_replace()

select json_set('{}', '$.a', 1);
{"a":1}
select json_set('{"a":1}', '$.b', 2);
{"a":1,"b":2}

array

select json_set('[1]', '$[0]', 2);
[2]
select json_set('[1,2]', '$[0]', 10);
[10,2]
select json_set('[1,2]', '$[1]', 20);
[1,20]

 末尾インデックスが存在しないときは追加する。json_set()=json_insert()+json_replace()

select json_set('[]', '$[0]', 1);
[1]
select json_set('[1,2]', '$[2]', 30);
[1,2,30]

 範囲外インデックスを指定しても変化なし。

select json_set('[]', '$[1]', 1);
[]

 インデックスに負数は設定できない。

select json_set('[]', '$[-1]', 1);
Error: JSON path error near '[-1]'

キーの値がオブジェクトのとき

select json_set('{"a":{"name":"yamada"}}', '$.a', 1);
{"a":1}

 まちがってオブジェクト構造を破壊してしまいそう……。

キーの値が配列のとき

select json_set('{"a":[1,2]}', '$.a', 1);
{"a":1}

 まちがって配列構造を破壊してしまいそう……。

配列の値がオブジェクトのとき

select json_set('[1]', '$[0]', json('{"a":1}'));
select json_set('[1]', '$[0]', json_object('a', 1));
[{"a":1}]
[{"a":1}]

配列の値が配列のとき

select json_set('[1]', '$[0]', json('[10]'));
select json_set('[1]', '$[0]', json_array(10));
[[10]]
[[10]]

nullをセットしても削除しない

 値nullがセットされる。

array

select json_set('[1]', '$', null);
select json_set('[1]', '$[0]', null);
[null]

object

select json_set('{"a": 1}', '$', null);
select json_set('{"a": 1}', '$.a', null);
select json_set('{"a": {"b": 1}}', '$.a.b', null);
{"a":null}
{"a":{"b":null}}

所感

 json_set()SQLでいうUPSERTだろう。追加と更新をするときの関数だ。削除はできない。変更箇所が1点のときjson_patch()よりネスト指定が楽な分だけ有用だろう。

情報源

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで