JSON Path Tester

Test JSONPath expressions against JSON data. Extract and filter data with powerful path queries.

Test JSONPath expressions against JSON data in real-time. Perfect for API development, data extraction, and JSON manipulation tasks.

Real-time JSONPath expression testing
Syntax highlighting for JSON and results
Built-in examples and common patterns
Error handling and validation
Multiple result formats
Copy results and expressions
No registration required
Completely free
Works in your browser

Quick Examples

Common Patterns:

JSONPath Reference

$ Root object/element
@ Current object/element
. or [] Child operator
.. Recursive descent
* Wildcard (all elements)
[,] Union operator
[start:end] Array slice
[?()] Filter expression

How to Use

  1. Enter or paste your JSON data in the left text area
  2. Write a JSONPath expression in the query field or use quick examples
  3. Click Test Path or press Enter to execute the query
  4. View results with match count and execution time
  5. Copy results in different formats (JSON, Array, Count, Paths)

Frequently Asked Questions

What is JSONPath?

JSONPath is a query language for JSON, similar to XPath for XML. It allows you to extract specific data from JSON structures using path expressions.

How do I filter data with conditions?

Use filter expressions like $[?(@.price > 10)] to find items where the price is greater than 10, or $[?(@.name == "John")] for exact matches.

Can I test multiple paths at once?

Currently, you can test one path at a time. Use the union operator [,] to combine multiple selections in a single expression.

Are the results real-time?

Yes, results update automatically as you type. The tool also shows execution time and match count for performance insights.

); return results; } function testPath() { const pathInput = document.getElementById('pathInput'); const path = pathInput.value.trim(); if (!path) { updatePathStatus('Enter JSONPath expression'); document.getElementById('resultSection').style.display = 'none'; return; } if (!currentJsonData) { updatePathStatus('Invalid JSON data', true); return; } try { const result = evaluateJsonPath(currentJsonData, path); if (result.error) { updatePathStatus('Expression error', true); showError('JSONPath Error: ' + result.error); return; } updatePathStatus(`${result.count} matches ✓`); lastResults = result; displayResults(result); document.getElementById('resultSection').style.display = 'block'; } catch (error) { updatePathStatus('Expression error', true); showError('Error executing JSONPath: ' + error.message); } } function displayResults(result) { const resultCount = document.getElementById('resultCount'); const executionTime = document.getElementById('executionTime'); const resultOutput = document.getElementById('resultOutput'); resultCount.textContent = `${result.count} match${result.count !== 1 ? 'es' : ''}`; executionTime.textContent = `${result.executionTime}ms`; updateResultFormat(); } function updateResultFormat() { if (!lastResults) return; const format = document.getElementById('resultFormat').value; const resultOutput = document.getElementById('resultOutput'); let output = ''; switch (format) { case 'json': output = JSON.stringify(lastResults.results, null, 2); break; case 'array': output = `[\n${lastResults.results.map(item => ' ' + JSON.stringify(item, null, 2).replace(/\n/g, '\n ') ).join(',\n')}\n]`; break; case 'count': output = `Count: ${lastResults.count}\nExecution Time: ${lastResults.executionTime}ms`; break; case 'paths': output = lastResults.paths.length > 0 ? lastResults.paths.join('\n') : 'Path tracking not available in this implementation'; break; } resultOutput.textContent = output; } function copyResults() { if (!lastResults) return; const format = document.getElementById('resultFormat').value; let textToCopy = ''; switch (format) { case 'json': textToCopy = JSON.stringify(lastResults.results, null, 2); break; case 'array': textToCopy = `[\n${lastResults.results.map(item => ' ' + JSON.stringify(item, null, 2).replace(/\n/g, '\n ') ).join(',\n')}\n]`; break; case 'count': textToCopy = `Count: ${lastResults.count}\nExecution Time: ${lastResults.executionTime}ms`; break; case 'paths': textToCopy = lastResults.paths.length > 0 ? lastResults.paths.join('\n') : 'Path tracking not available'; break; } copyToClipboard(document.querySelector('.copy-btn'), textToCopy); } function copyToClipboard(button, text) { const originalText = button.textContent; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(text).then(() => { button.textContent = 'Copied!'; button.classList.add('copied'); setTimeout(() => { button.textContent = originalText; button.classList.remove('copied'); }, 2000); }); } else { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; textArea.style.left = '-999999px'; textArea.style.top = '-999999px'; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand('copy'); button.textContent = 'Copied!'; button.classList.add('copied'); setTimeout(() => { button.textContent = originalText; button.classList.remove('copied'); }, 2000); } catch (err) { console.error('Failed to copy text: ', err); } textArea.remove(); } } // Event listeners document.getElementById('jsonInput').addEventListener('input', validateJson); document.getElementById('pathInput').addEventListener('input', testPath); document.getElementById('pathInput').addEventListener('keypress', function(e) { if (e.key === 'Enter') { testPath(); } }); // Initialize with basic example window.addEventListener('load', function() { loadExample('basic'); }); ); } function testPath() { const pathInput = document.getElementById('pathInput'); const path = pathInput.value.trim(); if (!path) { updatePathStatus('Enter JSONPath expression'); document.getElementById('resultSection').style.display = 'none'; return; } if (!currentJsonData) { updatePathStatus('Invalid JSON data', true); return; } try { const result = evaluateJsonPath(currentJsonData, path); if (result.error) { updatePathStatus('Expression error', true); showError('JSONPath Error: ' + result.error); return; } updatePathStatus(`${result.count} matches ✓`); lastResults = result; displayResults(result); document.getElementById('resultSection').style.display = 'block'; } catch (error) { updatePathStatus('Expression error', true); showError('Error executing JSONPath: ' + error.message); } } function displayResults(result) { const resultCount = document.getElementById('resultCount'); const executionTime = document.getElementById('executionTime'); const resultOutput = document.getElementById('resultOutput'); resultCount.textContent = `${result.count} match${result.count !== 1 ? 'es' : ''}`; executionTime.textContent = `${result.executionTime}ms`; updateResultFormat(); } function updateResultFormat() { if (!lastResults) return; const format = document.getElementById('resultFormat').value; const resultOutput = document.getElementById('resultOutput'); let output = ''; switch (format) { case 'json': output = JSON.stringify(lastResults.results, null, 2); break; case 'array': output = `[\n${lastResults.results.map(item => ' ' + JSON.stringify(item, null, 2).replace(/\n/g, '\n ') ).join(',\n')}\n]`; break; case 'count': output = `Count: ${lastResults.count}\nExecution Time: ${lastResults.executionTime}ms`; break; case 'paths': output = lastResults.paths.length > 0 ? lastResults.paths.join('\n') : 'Path tracking not available in this implementation'; break; } resultOutput.textContent = output; } function copyResults() { if (!lastResults) return; const format = document.getElementById('resultFormat').value; let textToCopy = ''; switch (format) { case 'json': textToCopy = JSON.stringify(lastResults.results, null, 2); break; case 'array': textToCopy = `[\n${lastResults.results.map(item => ' ' + JSON.stringify(item, null, 2).replace(/\n/g, '\n ') ).join(',\n')}\n]`; break; case 'count': textToCopy = `Count: ${lastResults.count}\nExecution Time: ${lastResults.executionTime}ms`; break; case 'paths': textToCopy = lastResults.paths.length > 0 ? lastResults.paths.join('\n') : 'Path tracking not available'; break; } copyToClipboard(document.querySelector('.copy-btn'), textToCopy); } function copyToClipboard(button, text) { const originalText = button.textContent; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(text).then(() => { button.textContent = 'Copied!'; button.classList.add('copied'); setTimeout(() => { button.textContent = originalText; button.classList.remove('copied'); }, 2000); }); } else { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; textArea.style.left = '-999999px'; textArea.style.top = '-999999px'; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand('copy'); button.textContent = 'Copied!'; button.classList.add('copied'); setTimeout(() => { button.textContent = originalText; button.classList.remove('copied'); }, 2000); } catch (err) { console.error('Failed to copy text: ', err); } textArea.remove(); } } // Event listeners document.getElementById('jsonInput').addEventListener('input', validateJson); document.getElementById('pathInput').addEventListener('input', testPath); document.getElementById('pathInput').addEventListener('keypress', function(e) { if (e.key === 'Enter') { testPath(); } }); // Initialize with basic example window.addEventListener('load', function() { loadExample('basic'); }); ); return results; } function testPath() { const pathInput = document.getElementById('pathInput'); const path = pathInput.value.trim(); if (!path) { updatePathStatus('Enter JSONPath expression'); document.getElementById('resultSection').style.display = 'none'; return; } if (!currentJsonData) { updatePathStatus('Invalid JSON data', true); return; } try { const result = evaluateJsonPath(currentJsonData, path); if (result.error) { updatePathStatus('Expression error', true); showError('JSONPath Error: ' + result.error); return; } updatePathStatus(`${result.count} matches ✓`); lastResults = result; displayResults(result); document.getElementById('resultSection').style.display = 'block'; } catch (error) { updatePathStatus('Expression error', true); showError('Error executing JSONPath: ' + error.message); } } function displayResults(result) { const resultCount = document.getElementById('resultCount'); const executionTime = document.getElementById('executionTime'); const resultOutput = document.getElementById('resultOutput'); resultCount.textContent = `${result.count} match${result.count !== 1 ? 'es' : ''}`; executionTime.textContent = `${result.executionTime}ms`; updateResultFormat(); } function updateResultFormat() { if (!lastResults) return; const format = document.getElementById('resultFormat').value; const resultOutput = document.getElementById('resultOutput'); let output = ''; switch (format) { case 'json': output = JSON.stringify(lastResults.results, null, 2); break; case 'array': output = `[\n${lastResults.results.map(item => ' ' + JSON.stringify(item, null, 2).replace(/\n/g, '\n ') ).join(',\n')}\n]`; break; case 'count': output = `Count: ${lastResults.count}\nExecution Time: ${lastResults.executionTime}ms`; break; case 'paths': output = lastResults.paths.length > 0 ? lastResults.paths.join('\n') : 'Path tracking not available in this implementation'; break; } resultOutput.textContent = output; } function copyResults() { if (!lastResults) return; const format = document.getElementById('resultFormat').value; let textToCopy = ''; switch (format) { case 'json': textToCopy = JSON.stringify(lastResults.results, null, 2); break; case 'array': textToCopy = `[\n${lastResults.results.map(item => ' ' + JSON.stringify(item, null, 2).replace(/\n/g, '\n ') ).join(',\n')}\n]`; break; case 'count': textToCopy = `Count: ${lastResults.count}\nExecution Time: ${lastResults.executionTime}ms`; break; case 'paths': textToCopy = lastResults.paths.length > 0 ? lastResults.paths.join('\n') : 'Path tracking not available'; break; } copyToClipboard(document.querySelector('.copy-btn'), textToCopy); } function copyToClipboard(button, text) { const originalText = button.textContent; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(text).then(() => { button.textContent = 'Copied!'; button.classList.add('copied'); setTimeout(() => { button.textContent = originalText; button.classList.remove('copied'); }, 2000); }); } else { // Fallback for older browsers const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; textArea.style.left = '-999999px'; textArea.style.top = '-999999px'; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand('copy'); button.textContent = 'Copied!'; button.classList.add('copied'); setTimeout(() => { button.textContent = originalText; button.classList.remove('copied'); }, 2000); } catch (err) { console.error('Failed to copy text: ', err); } textArea.remove(); } } // Event listeners document.getElementById('jsonInput').addEventListener('input', validateJson); document.getElementById('pathInput').addEventListener('input', testPath); document.getElementById('pathInput').addEventListener('keypress', function(e) { if (e.key === 'Enter') { testPath(); } }); // Initialize with basic example window.addEventListener('load', function() { loadExample('basic'); });