JSONはAPIで最も広く使用されているデータ形式であり、多くのAPIリクエストはJSONレスポンスボディで情報を返します。JSONレスポンスボディからアサーションを作成したり、変数を作成したりするには、JSONパスを記述する必要があります。JSONパスは、レスポンスから必要な特定の情報を抽出します。たとえば、次のJSONパスはレスポンスボディからユーザーIDを抽出します。
JSONパスでIDを抽出する
JSONレスポンスボディはオブジェクトと配列で構成されています。
- オブジェクトは
{ }で囲まれたキーと値のペアです。キーと値のペアの値は、ブール値、文字列、オブジェクト、数値、または配列になります。 - 配列は
[ ]で囲まれた順序付きリストです。
JSONレスポンスボディは、オブジェクト内の配列や配列内のオブジェクトなど、深くネストされた構造を持つことがあります。この記事では、mablがそれらの構造に対してJSONパスを記述するためにサポートしている構文と、mablがサポートしていないJSONPath機能について説明します。
キー
JSONオブジェクトでは、キーを使用して特定の値にアクセスします。たとえば、下記のJSONレスポンスボディの値true にアクセスするためのJSONパスは、キー "authenticated" から引用符を除いたもの authenticated となります。
{
"authenticated": true
}ドット記法
ネストされたオブジェクト内の値を抽出する必要がある場合、JSONパスはドット記法でキーを使用します。ドット記法とは、JavaScriptでネストされたプロパティにアクセスするのと同じように、リテラルのピリオドを使ってキーをつなぐことを意味します。次のレスポンスでは、"email@example.com"という値にアクセスするためのJSONパスはdata.emailです。
{
"data": {
"id": 7,
"email": "email@example.com",
"first_name": "John",
"last_name": "Smith",
"image": "https://example.com/7/image.jpg"
}
}角括弧
JSONパスでは、値にアクセスするために角括弧も使用します。最も一般的なのは配列内のアイテムにアクセスする場合ですが、ドットを含むキーにアクセスする場合にも使用します。
配列
配列は0から数えるため、配列の最初のアイテムのインデックスは0です。たとえば、data[0]は次のレスポンスボディの"comedy"にアクセスします。
{
"statusCode": 200,
"message": "Genres",
"data": [
"comedy",
"horror",
"noir",
"action",
"drama",
"rom-com",
"art house"
]
}オブジェクトの配列内のオブジェクトにアクセスする場合は、キーと角括弧およびドット記法を組み合わせて、目的の値にアクセスできます。たとえば、3番目のユーザーの一意のIDにアクセスするためのJSONパスはrecords[2].idです。
{
"records": [
{
"id": "rec25eKmUsfiieG2B",
"createdTime": "2021-05-21T20:17:43.000Z",
"username": "Jonny W"
},
{
"id": "rec2dLF92AG8JTL0S",
"createdTime": "2021-03-20T18:02:38.000Z",
"username": "Debbie"
},
{
"id": "rec5w5lUPzN8Yd3um",
"createdTime": "2021-03-20T20:41:51.000Z",
"username": "Louie"
}
]
}ラップされていない配列レスポンス
レスポンスボディ自体が配列の場合、パスは角括弧内のインデックスから始める必要があります。次の例では、[1].nameが値"Barb"を取得します。
[
{
"name": "Ron",
"occupation": "Physician"
},
{
"name": "Barb",
"occupation": "Nuclear physicist"
}
]ドットを含むキー
角括弧を使用して、ドットを含むキーの値にアクセスすることもできます。次の例では、Bobのメールアドレスにアクセスするために[0]["person.Email"]という構文を使用する必要があります。
[
{
"person.Name": "Bob",
"person.Email": "bob@example.com"
}
]プロパティ値で配列内のオブジェクトを検索する
プロパティ値で配列内のオブジェクトを検索するには、次のいずれかの方法を使用します。
- 配列の順序が安定している場合は、予測可能なインデックスを使用します。
- 配列の順序が変わる可能性がある場合は、一致するオブジェクトを検索するリクエスト後処理用JavaScriptスニペットを記述できます。たとえば、次のスニペットはusernameが「Debbie」と一致するレコードを検索し、そのidを「matched_id」という変数に格納します。
const body = pm.response.json();
const match = body.records.find(r => r.username === "Debbie");
if (match) {
pm.variables.set("matched_id", match.id);
}制限事項
mablのJSONパスパーサーは、上記のキー、ドット記法、および角括弧の構文をサポートしています。他のツールの以下のJSONPath機能はサポートしていません。
-
ワイルドカード(
records[*].idなど) -
ルートセレクター パスの先頭に記述する
$. -
再帰的降下(
..を使用) -
フィルター式(
records[?(@.username == "Debbie")].idなど)。回避策については、プロパティ値で配列内のオブジェクトを検索するセクションを参照してください。
これらの機能を使用するパスは「Cannot find anything for that body path.」を返します。JSONPath機能のサポートをリクエストするには、mablプロダクトポータルでアイデアを送信してください。