json_path
Purpose
json_path flattens the current RRPair down to its JSON representation and then extracts data using a JSONPath locator and regular expression filter. This extractor is very uncommon and is mostly used by automation. If you just want to extract a JSON key you are most likely looking for the json_path. You can see examples of RRPairs in JSON format by looking inside of your snapshot raw, action or reaction files. These files are what speedctl pull snapshot
downloads to your local machine in the directory ~/.speedscale/data/snapshots
.
Certain special cases are supported that allow deep inspection inside of certain data types. For example, you can append .jwt.claims.<name>
to your JSONPath to look "inside" a JWT. See full example below.
Usage
"type": "json_path",
"config": {
"path": "<JSON path to data>",
"regex": "<regular expression to use as a submatch filter>
}
- path - A properly formatted JSON Path expression with a few extra features.
- regex - (optional) a regular expression to be used as a submatch filter on the extracted value
Examples
Example 1: Basic JSON Path Extraction
Configuration
{
"type": "json_path",
"config": {
"path": "http.req.body.user.email"
}
}
Before (RRPair JSON)
{
"http": {
"req": {
"body": "{\"user\": {\"email\": \"john.doe@example.com\", \"id\": 123}}"
}
}
}
After (Extracted Value)
john.doe@example.com
Example 2: Array Element Extraction
Configuration
{
"type": "json_path",
"config": {
"path": "http.res.body.data.items[0].id"
}
}
Before (RRPair JSON)
{
"http": {
"res": {
"body": "{\"data\": {\"items\": [{\"id\": \"item-001\", \"name\": \"Product A\"}, {\"id\": \"item-002\", \"name\": \"Product B\"}]}}"
}
}
}
After (Extracted Value)
item-001
Example 3: Header Extraction with Regex
Configuration
{
"type": "json_path",
"config": {
"path": "http.req.headers.Authorization.0",
"regex": "^(?i)Bearer (.*)(?-i)"
}
}
Before (RRPair JSON)
{
"http": {
"req": {
"headers": {
"Authorization": ["Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."]
}
}
}
}
After (Extracted Value)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Example 4: JWT Claims Extraction
Configuration
{
"type": "json_path",
"config": {
"path": "http.req.headers.Authorization.0.jwt.claims.sub"
}
}
Before (RRPair JSON)
{
"http": {
"req": {
"headers": {
"Authorization": ["Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"]
}
}
}
}
After (Extracted Value)
1234567890
Example 5: JWT Claims with Email
Configuration
{
"type": "json_path",
"config": {
"path": "http.req.headers.Authorization.0.jwt.claims.email"
}
}
Before (RRPair JSON)
{
"http": {
"req": {
"headers": {
"Authorization": ["Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZW1haWwiOiJqb2huLmRvZUBleGFtcGxlLmNvbSIsImlhdCI6MTUxNjIzOTAyMn0.kP_DYKsOCWRkr-SgT6dhUCrgk4xZBZgGiYxE3xWHYeQ"]
}
}
}
}
After (Extracted Value)
john.doe@example.com
Example 6: Nested JSON with Filtering
Configuration
{
"type": "json_path",
"config": {
"path": "http.res.body.users[*].roles[?(@.name=='admin')].permissions",
"regex": "write|delete"
}
}
Before (RRPair JSON)
{
"http": {
"res": {
"body": "{\"users\": [{\"id\": 1, \"roles\": [{\"name\": \"admin\", \"permissions\": \"read,write,delete\"}]}]}"
}
}
}
After (Extracted Value)
write