PythonのJSONPathの例
JSONPathとは何ですか?
JSONPathはJSONデータを解析するための式言語です。これは、XMLデータを解析するXPath式言語に非常に似ています。JSONデータを解析し、必要な値を取得することが目的です。これは完全なJSONデータを読み込む必要がないため、メモリの効率が良くなります。
PythonのJSONPathライブラリ
Pythonには多くのJSONPathライブラリがあります。
-
- jsonpath: これは、PerlとJavaScriptバージョンのJSONPathの移植版です。
-
- jsonpath-rw: JSONPath式のPythonの完全な実装です。JSONPath式は一級オブジェクトであり、解析、変換、解析、印刷、および拡張が容易です。jsonpath-rw-extモジュールは、その機能を拡張するためのいくつかの追加の拡張機能を提供しています。
- jsonpath-ng: JSONPathの最終的な実装であり、算術演算子や二進比較演算子を含めて標準に準拠することを目指しています。このライブラリは、jsonpath-rwおよびjsonpath-rw-extモジュールを統合し、さらに拡張しています。
どのPythonのJSONPathライブラリを使用すべきか?
jsonpath-ngモジュールは、最も包括的なものであり、完全にPythonで書かれています。Python 2とPython 3の両方をサポートしています。したがって、PythonのJSONPathの例にはこのモジュールを使用します。
jsonpath-ngモジュールのインストール
私たちは、PIPを使用してjsonpath-ngモジュールをインストールすることができます。
$ pip3.7 install jsonpath-ng
JSONPathを使用して、シンプルなJSONデータを分析する。
JSONデータを解析し、必要な属性の値を取得するために、簡単な例を見てみましょう。
import json
from jsonpath_ng import jsonpath, parse
json_string = '{"id":1, "name":"Pankaj"}'
json_data = json.loads(json_string)
jsonpath_expression = parse('$.id')
match = jsonpath_expression.find(json_data)
print(match)
print("id value is", match[0].value)
出力:
[DatumInContext(value=1, path=Fields('id'), context=DatumInContext(value={'id': 1, 'name': 'Pankaj'}, path=Root(), context=None))]
id value is 1
私たちはJSON文字列を辞書に変換するためにjsonモジュールを使用しています。
JSONPath式を使用してリストをパースする。
JSONキーには値のリストを含めることができます。そのリストを解析し、値のリストを取得するためにJSONPath式を使用することができます。以下の内容を持つ「db.json」というJSONファイルがあるとしましょう。
{
"employees": [
{
"id": 1,
"name": "Pankaj",
"salary": "10000"
},
{
"name": "David",
"salary": "5000",
"id": 2
}
]
}
このJSONファイルをパースして従業員IDのリストを取得したいです。JSONPath式を使用すれば、このデータを非常に簡単に取得できます。
import json
from jsonpath_ng import jsonpath, parse
with open("db.json", 'r') as json_file:
json_data = json.load(json_file)
print(json_data)
jsonpath_expression = parse('employees[*].id')
for match in jsonpath_expression.find(json_data):
print(f'Employee id: {match.value}')
結果:
{'employees': [{'id': 1, 'name': 'Pankaj', 'salary': '10000'}, {'name': 'David', 'salary': '5000', 'id': 2}]}
Employee id: 1
Employee id: 2
おすすめの読み物:Python f-strings – PEP 498 – リテラル文字列の補完
データをリストに入れたい場合、Pythonのリスト内包表記を使用することができます。
emp_ids_list = [match.value for match in jsonpath_expression.find(json_data)]
print(emp_ids_list) # [1, 2]
結論
JSONPathはJSONデータを解析し、特定の値を抽出する簡単な方法を提供します。JSONデータが巨大で、わずかな値に興味がある場合に非常に便利です。
引用
- jsonpath.com: to test the JSONPath expression validity
- jsonlint.com: to validate JSON data