JSONPath の不満

JSONPath の表現力に対しては不満がある。 以下のように再帰的に 0 を探すというクエリを適用した場合を見てみよう。

(use rfc.json)
(use sjsonpath)

(define test-object
  (parse-json-string "{\"0\": [{\"foo\": 1}]}"))

(define query
  (sjsonpath "$..0"))

(query test-object)
;; (#(#0=(("foo" . 1))) #0#)

クエリにマッチするデータはふたつある。 オブジェクトのプロパティ名が 0 の場合と配列の 0 番目の両方が抽出された結果だ。

常識的に考えれば両方にマッチさせたいという場合はちょっと考え難いが、 JSONPath では区別できないのである。

また、 SJSONPath に文字列表現の JSONPath を混在させれれば便利だと考えていたけれど、そう簡単な話ではないことにも気付いた。

例えば以下のようなクエリを考えるとわかりやすい。

(sjsonpath '("..a"))

このクエリは

(sjsonpath '(// "a"))

であるかのように扱えるだろうか。 答えは No だ。

こんな JSON から値を抽出することを考えているのかもしれない。

{"..a": 1}

いずれの問題も JSON ではオブジェクトのプロパティ名にあらゆる文字列を入れられるということに起因している。 あるいは、 XPath の考え方を元にしてクエリ言語を設計しようとしていることが間違いなのかもしれない。

Document ID: e7da4f721256bc3f3df80c7efcefd8e2