JSONPath vs jq vs json.express — Which JSON Query Tool Should You Use?

If you work with JSON data—and in 2026, who doesn't?—you've likely encountered multiple tools for querying and transforming JSON. Three names come up frequently: JSONPath, jq, and json.express. While they all solve similar problems, they approach JSON querying differently, each with distinct strengths and use cases.

This guide breaks down the key differences, compares their syntax, and helps you choose the right tool for your specific situation.

The Three Tools: Quick Overview

JSONPath is a standardized query language for JSON, designed to work across multiple programming languages and environments. It's deeply influenced by XPath (XML's query language) and prioritizes consistency and broad applicability.

jq is a powerful command-line JSON processor, designed primarily for Unix/Linux environments. It's a full programming language that goes beyond simple queries to support complex transformations, filtering, and data manipulation.

json.express is a browser-based JSON query and visualization tool that prioritizes simplicity and accessibility. It supports a practical subset of JSON Path syntax optimized for interactive exploration in the browser without requiring installation or command-line knowledge.

Syntax Comparison: Common Operations

Let's compare how each tool handles typical JSON querying tasks using this example data:

{
  "users": [
    {
      "id": 1,
      "name": "Alice",
      "email": "alice@example.com",
      "role": "admin",
      "posts": [
        {"id": 101, "title": "First", "likes": 42},
        {"id": 102, "title": "Second", "likes": 15}
      ]
    },
    {
      "id": 2,
      "name": "Bob",
      "email": "bob@example.com",
      "role": "user",
      "posts": [
        {"id": 103, "title": "Hello", "likes": 8}
      ]
    }
  ]
}

Access a Nested Property

Goal: Get the first user's email

Tool Syntax Notes
JSONPath $.users[0].email Dollar sign indicates root; standard notation
jq .users[0].email Leading dot indicates current context
json.express users[0].email Implicit root, cleaner syntax

All three work identically for this operation. The differences are stylistic—JSONPath's $ is explicit about referencing root, while jq and json.express are more concise.

Extract Values from All Array Elements (Wildcard)

Goal: Get all user names

Tool Syntax Notes
JSONPath $.users[*].name Standard wildcard operator
jq .users[] | .name or .users[].name Uses pipe operator for chaining
json.express users[*].name Intuitive wildcard syntax

Here we see a stylistic difference. JSONPath and json.express use the same [*] wildcard pattern, while jq uses [] and emphasizes the pipe operator for chaining operations.

Result in all cases:

["Alice", "Bob"]

Array Slicing

Goal: Get the first two array elements

Tool Syntax Notes
JSONPath $.users[0:2] Standard Python-style slicing
jq .users[0:2] Same syntax as JSONPath
json.express users[0:2] Same syntax, implicit root

Result:

[
  {"id": 1, "name": "Alice", ...},
  {"id": 2, "name": "Bob", ...}
]

Recursive Descent (Search at Any Depth)

Goal: Find all email properties anywhere in the structure

Tool Syntax Notes
JSONPath $..email Double dot at root level
jq .. | select(type == "object") | .email More verbose; requires filtering
json.express ..email Double dot for recursive search

This is where the tools diverge. JSONPath and json.express provide simple recursive descent syntax, while jq requires explicit filtering logic.

Result:

["alice@example.com", "bob@example.com"]

Filtering (Conditional Queries)

Goal: Get all admins (users where role == "admin")

Tool Syntax Notes
JSONPath $.users[?(@.role == 'admin')] Filter expressions in brackets
jq .users[] | select(.role == "admin") select() function with condition
json.express Not directly supported Must query manually or pre-filter

Result:

[
  {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com",
    "role": "admin",
    ...
  }
]

Here jq and JSONPath excel. json.express prioritizes simplicity and doesn't include filtering, so you'd need to export results and filter them in a spreadsheet or code editor.

Complex Transformations

Goal: Create a list of user objects with only name and email

Tool Syntax Notes
JSONPath $.users[*] | {name: @.name, email: @.email} Not standard; implementation-dependent
jq .users[] | {name, email} Compact object construction syntax
json.express Not supported Would require external tool

This is where jq absolutely dominates. It's a full programming language that can construct, transform, and combine data in sophisticated ways.

.users | map({name, email})

Result:

[
  {"name": "Alice", "email": "alice@example.com"},
  {"name": "Bob", "email": "bob@example.com"}
]

Feature Comparison Table

Feature JSONPath jq json.express
Basic path queries
Array wildcards
Array slicing
Recursive descent ✅ (complex)
Filtering/conditions
Data transformation ⚠️
Aggregation (sum, avg)
String manipulation
Custom functions
No installation
Browser-based ⚠️
Visual exploration
Learning curve Low Steep Very low

When to Use Each Tool

Use JSONPath When:

JSONPath implementations vary slightly by language, so test your queries thoroughly if switching between platforms.

Use jq When:

jq is the go-to for DevOps engineers, data engineers, and anyone processing JSON at scale. The learning curve is real, but the payoff is enormous flexibility.

Use json.express When:

json.express prioritizes developer experience and accessibility over feature completeness. Perfect for prototyping, debugging, and exploration.

Real-World Scenarios

Scenario 1: Debugging a REST API Response

You just got a complex 2000-line API response and need to understand its structure and extract a few values quickly.

Best choice: json.express

Why? You need immediate visual feedback. Paste the JSON, explore the tree view, write queries interactively, and share the query with teammates via a URL. No installation, no command line, instant results.

Scenario 2: Processing JSON Files in a CI/CD Pipeline

Your deployment pipeline receives a config file in JSON and needs to extract values, validate them, and construct a new configuration object.

Best choice: jq

Why? You're already in a Unix environment (probably). jq handles multi-step transformations, can read from files or stdin, and integrates seamlessly with shell scripts. jq '.config | {image: .docker.image, port: .server.port}' config.json is perfect for this.

Scenario 3: Querying JSON in a Web Application

Your JavaScript code receives JSON from an API and needs to extract specific fields for display.

Best choice: json.express (for prototyping) or native JavaScript (for production)

For quick prototyping or debugging, use json.express to test queries. For production, use native JavaScript or a lightweight library. JSONPath libraries are available for JavaScript but add dependencies.

Scenario 4: Standardizing JSON Query Logic Across Teams

Your organization uses multiple languages (Java, Python, C#, Node.js) and wants a consistent way to query JSON across projects.

Best choice: JSONPath

Why? It's standardized and has implementations in virtually every language. Teams can write queries once and use them across platforms. Document your subset of JSONPath to avoid implementation-specific features.

Syntax Similarities and Differences at a Glance

Sample: {"data": [{"x": 1}, {"x": 2}]}
Operation JSONPath jq json.express
Root reference $ . (implicit)
Child access .data .data .data
Array element [0] [0] [0]
All elements [*] [] [*]
Slice [0:2] [0:2] [0:2]
Recursive search ..x .. | .x ..x
Pipe/chain Rare Fundamental Composition
Filter [?(...)] select(...) N/A

Practical Tips

  1. Start with json.express if you're new to JSON querying. The syntax is intuitive and the browser interface provides immediate visual feedback.

  2. Invest in jq if you regularly work with JSON from the command line. It's worth the learning curve.

  3. Learn JSONPath basics to understand standardized query concepts that translate across tools.

  4. Keep queries simple in production code. Complex queries are hard to maintain; if you need sophisticated transformations, consider building the logic in your programming language.

  5. Test queries incrementally. Build up from simple to complex, verifying results at each step.

Conclusion

Each tool excels in different contexts:

For most developers, the answer isn't "use one tool always"—it's understanding when each tool shines and reaching for the right one for the job. Start exploring with json.express, deepen your knowledge with JSONPath docs, and graduate to jq when you need heavyweight data transformation.

The beauty of modern JSON tools is that you have excellent options for every use case. Choose wisely, and JSON querying becomes a superpower rather than a chore.

Try it yourself

json.express is a free, private JSON tool that runs entirely in your browser.

Open json.express
Related Tools