すべての記事

JSONPath:手動でパースせずにJSONデータを検索する

JSONPathはパスを指定してJSONドキュメントから値を取り出すクエリ言語で、XMLに対するXPathと同じ役割を果たす。日本の官公庁システムや金融機関では歴史的にXML/SOAPベースの連携が多く残っており、そこからJSON APIへ移行した開発者にはこの構文が馴染み深いはずだ。

基本構文

式は必ず$から始まり、これはドキュメントのルートを表す。そこからドット表記($.user.name)や角かっこ表記($['user']['name'])でフィールドにアクセスし、配列の要素にはインデックス($.items[0])でアクセスする。

複数の値をまとめて選択する

ワイルドカード*はある階層のすべての要素を選択し、..は再帰的な探索で、正確なパスを知らなくても任意の深さにあるフィールドを見つけ出す。[?(@.price < 10)]のようなフィルターは、プログラミング言語の式に似た条件で配列の要素を選択する。

実務でどう使われるか

  • デバッグ中に大きなAPIレスポンスから特定のフィールドをスクリプトなしで素早く取り出す。
  • JSON形式のログやイベントを、その場で条件に基づいてフィルタリングする。
  • パーサーを自作せずに設定ファイルから値を読み取る。

JSONPath対XPath: インデックスのずれによる典型的なミス

XPathではノードのインデックスが1から始まる(book[1]が最初の要素)ため、そこからJSONPathに移った開発者はよくつまずく — JSONPathではインデックスが0から始まり、book[1]はすでに2番目の要素になる。この違いだけで、古いXML/XPathベースの連携をJSON APIに移行する際のバグの少なからぬ部分を占めている。

ドットやスペースを含むキー

フィールド名自体にドット、ハイフン、スペースが含まれている場合(ネストしたフィールドではなく、文字どおりのキー"user.name"である場合)、ドット表記$.user.nameは曖昧になる — パーサーはこれをネストしたフィールドusernameとして読み取ってしまう。このような場合は、キーを引用符付きの角かっこで囲む必要がある: $['user.name']

ツールを試す