GJSON Paths
GJSON is Monad’s path syntax for UI-based transforms. When you can’t use jq (trial accounts or simpler needs), GJSON provides powerful field access for native transforms.
Why GJSON?
-
UI transforms use GJSON paths to specify field locations
-
Trial accounts have limited jq access - GJSON works
-
Simpler syntax for basic field operations
-
Performance - compiled path evaluation
Basic Syntax
Dot Notation
user.name → "jdoe"
endpoint.ip → "10.50.1.100"
ise.policy_set → "Wired_802.1X_Closed"
Nested Access
// Input
{
"user": {
"identity": {
"name": "jdoe",
"domain": "CHLA"
}
}
}
user.identity.name → "jdoe"
user.identity.domain → "CHLA"
Array Access
By Index
// Input
{
"endpoints": [
{"ip": "10.0.0.1", "status": "active"},
{"ip": "10.0.0.2", "status": "inactive"}
]
}
endpoints.0.ip → "10.0.0.1"
endpoints.1.status → "inactive"
endpoints.# → 2 (array length)
By Query
# First active endpoint
endpoints.#(status=="active").ip → "10.0.0.1"
# All active endpoints
endpoints.#(status=="active")#.ip → ["10.0.0.1"]
Query Operators
| Operator | Meaning | Example |
|---|---|---|
|
Equals |
|
|
Not equals |
|
|
Less than |
|
|
Less than or equal |
|
|
Greater than |
|
|
Greater than or equal |
|
|
Pattern match (like) |
|
|
Not pattern match |
|
Wildcards
# All values at depth 1
*.name → All name fields
# Recursive search
..ip → All ip fields at any depth
ISE Log Paths
RADIUS Authentication
{
"timestamp": "2026-03-15T14:30:45Z",
"severity": "high",
"event_type": "auth_failure",
"user": {
"name": "jdoe",
"domain": "CHLA"
},
"endpoint": {
"mac": "AA:BB:CC:DD:EE:FF",
"ip": "10.50.10.100"
},
"ise": {
"policy_set": "Wired_802.1X_Closed",
"authorization_profile": "DENY_ACCESS",
"auth_result": "FAILED",
"failure_reason": "Certificate validation failed"
}
}
Paths:
| Path | Returns |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
TACACS Command Accounting
{
"timestamp": "2026-03-15T14:35:00Z",
"event_type": "command_accounting",
"user": {
"name": "admin",
"privilege_level": 15
},
"device": {
"hostname": "switch-core-01",
"ip": "10.50.1.10"
},
"tacacs": {
"command": "show running-config",
"arguments": [],
"elapsed_time": 2.5
}
}
Paths:
| Path | Returns |
|---|---|
|
|
|
|
|
|
FTD Firewall Paths
{
"timestamp": "2026-03-15T14:40:00Z",
"action": "deny",
"src": {
"ip": "192.168.1.50",
"port": 45678,
"zone": "inside"
},
"dst": {
"ip": "8.8.8.8",
"port": 443,
"zone": "outside"
},
"protocol": "tcp",
"rule": {
"name": "Block_Malicious",
"id": "rule-123"
},
"threat": {
"signature": "ET TROJAN C2 Beacon",
"severity": "critical"
}
}
Paths:
| Path | Returns |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Using GJSON in UI Transforms
drop_record_where_value_eq
| Field | Value |
|---|---|
Key |
|
Value |
|
Uses GJSON path severity to access the field.
rename_key
| Field | Value |
|---|---|
Old Key |
|
New Key |
|
create_key_value_if_key_value
| Field | Value |
|---|---|
Condition Key |
|
Condition Value |
|
New Key |
|
New Value |
|
UI Transform Workflow (CHLA Example)
Step 1: Filter Info Logs
Transform Type |
|
Key |
|
Value |
|
Impact: Drops ~50% of ISE logs
Step 2: Drop Successful Auths
Transform Type |
|
Key |
|
Value |
|
Impact: Drops ~60% of remaining RADIUS logs
Step 3: Tag for Sentinel
Transform Type |
|
Key |
|
Value |
|
Step 4: Add MITRE Tag
Transform Type |
|
Condition Key |
|
Condition Value |
|
New Key |
|
New Value |
|
Step 5: Normalize Field Names
Transform Type |
|
Old Key |
|
New Key |
|
GJSON vs jq
| Feature | GJSON | jq |
|---|---|---|
Availability |
UI transforms, all accounts |
jq transform, may be limited |
Complexity |
Field access, simple queries |
Full JSON transformation |
Conditionals |
Query operators in paths |
if-then-else, case |
Learning Curve |
Lower |
Higher |
Use Case |
Simple field operations |
Complex routing logic |
When to use GJSON: - Simple field renames, drops, conditionals - Trial account limitations - Quick transforms without jq
When to use jq: - Complex routing with multiple conditions - OCSF normalization - MITRE tagging with lookup tables
Debugging Paths
Test in Pipeline Logs
-
Create test pipeline with HTTP input
-
Send sample JSON
-
View logs to see parsed fields
-
Verify paths work as expected
Test with jq
# GJSON path: user.identity.name
# Equivalent jq: .user.identity.name
echo '{"user":{"identity":{"name":"jdoe"}}}' | jq '.user.identity.name'
Common Issues
| Issue | Symptom | Fix |
|---|---|---|
Missing field |
Transform doesn’t apply |
Verify path with sample log |
Array without index |
Wrong value returned |
Use |
Case sensitivity |
No match |
GJSON is case-sensitive |
Key Takeaways
-
GJSON for UI transforms - Specify field locations
-
Dot notation for nesting -
user.identity.name -
Array access with index or query -
.0or#(status=="active") -
Query operators -
==,!=,<,>,% -
Use jq for complex logic - GJSON for simple operations
-
Test paths with sample data - Before deploying
Next Module
Routing Patterns - CHLA-specific patterns for Sentinel/S3 routing.