- JSON Pathは、JSONドキュメントからデータを抽出するために使えるクエリ言語
- OpenAPIはJSONまたはYAMLドキュメントであるため、JSON Pathを使ってOpenAPI上でさまざまな作業を行える
- OpenAPI Overlayを使って、ドキュメントに追加内容やコードサンプルなどをパッチ適用
- Spectralで使って高度なルールを作成可能
- AWS Step Functionsでも利用可能
- JSON Pathの動作方法
- JSONデータ構造を探索・フィルタリングし、特定の部分を抽出
- XPathに似た構文(XMLで使用)
- 構文例:
$.store.book[?@.price < 10].title
- OpenAPIでの活用
jpp コマンドを使ってOpenAPIドキュメントをクエリし、特定の部分を抽出可能
- Overlayを使ってOpenAPIドキュメントを修正したり情報を追加したりするのに使用
- 説明の更新、連絡先情報の追加など
- サーバー一覧から開発/ステージングサーバーを削除し、本番環境だけを残す
- 新しいサンドボックスサーバー情報の追加など
- JSON Pathについてさらに学ぶ
- 2024年にIETFで標準として制定(RFC 9535)
- 以前は複数の派生仕様が存在していたが、標準化によって統一される流れ
- RFC 9535の構文に従うのが望ましい
GN⁺の意見
- JSON Pathはますます多くの場所で使われるようになっており、知っておくと役立つ技術。特にOpenAPIを扱う開発者やテクニカルライターにとって必須スキルになりそう。
- まだJSON Pathの構文が完全には統一されておらず多少の混乱はあるが、RFC 9535を基準にするのが望ましそう。今後は関連ツールもこの標準に従っていくことが期待される。
- OpenAPI OverlayやSpectralなど、開発プロセスで活用できる領域が幅広いように見える。単なるデータ抽出だけでなく、ドキュメント補完、検証、整備などにも活用できる可能性が高い。
- ただし構文がやや複雑で、JSON/YAMLに慣れている必要があるため参入障壁はある。シンプルな使い方から始めて、徐々に高度な機能を学んでいくのがよさそう。
jq や yq のようなコマンドラインツールを活用すると練習しやすそう。Bump.shのような統合ツールを使うのも生産性向上に役立ちそう。
2件のコメント
ありがとうございます
Hacker Newsの意見
JSONata(https://jsonata.org)はJSON操作のための最高のツールの1つで、JsonPath構文を使い、ノード選択だけでなく算術、比較、並べ替え、グループ化、日付操作、集計などのヘルパー関数も提供している。JSで書かれており、Nodeやブラウザで利用でき、Pythonラッパー(https://pypi.org/project/pyjsonata/)もある。
json_profile(https://github.com/tylerneylon/json_profile)は、新しいJSONファイルの主要なスキーマやデータの位置を素早く理解するのに役立つツールで、リスト内の同階層要素が同じ構造を持つときに有用。ファイル構造を学習し、最も重い集計パスを出力し、パスごとのサイズのヒントを提供する。
espath(https://github.com/tomhodgins/espath)は、XPathとCSSセレクタを使ってJSONのデータをフィルタリングして見つけるライブラリ。JavaScriptオブジェクトをXML DOMに変換してクエリを実行したあと再びオブジェクトに変換するか、元のオブジェクトレジスタを維持して元のオブジェクトを検索する方式で動作する。
JSONが表すデータ構造に一般的な名前があるのかという質問と、JSON、YAML、Python辞書、TOMLなど類似した構造で動作するパス言語の必要性への言及がある。
SQLiteは、json_extract()のような関数で使われるJSON Pathのサブセットをコアデータベースに含めている。関連する詳細ノート: https://til.simonwillison.net/sqlite/json-extract-path
InsomniaとBrunoには、JSON Pathを使ってレスポンスをフィルタリングする機能がある。
PostgreSQLのjsonpathサポートを使って、DB行に対するユーザー定義のフィルタリングルールを作るのに使ったことがある。
XPATHインジェクションが広く使われていたのと同じように、JSONパスインジェクション攻撃も避けられないと予想される。(https://owasp.org/www-community/attacks/XPATH_Injection 参照)
jqのような類似ツールへの言及がないのが不思議。
JSONパス構文が多すぎるのが残念。jq、JSON path、AWS CLI、MySQLなどがそれぞれ異なる構文を使うため、筋肉記憶を身につけにくい。