菜单

JSONPath 解析器

通过编写 JSONPath 表达式对 JSON 数据进行灵活查询与过滤,类似 XPath 操作 XML 的方式,支持返回匹配节点,大幅简化 JSON 数据的提取过程

输入 JSON

结果

)) query = ' + query; var parts = query.split(/\.(?![^\[]*\])/); function walk(node, path) { if (path.length === 0) { result.push(node); return; } var seg = path[0]; var rest = path.slice(1); if (seg === ' ) { walk(node, rest); return; } if (seg === '*') { if (Array.isArray(node)) node.forEach(function(item) { walk(item, rest); }); else if (typeof node === 'object' && node !== null) Object.values(node).forEach(function(v) { walk(v, rest); }); return; } var bracketMatch = seg.match(/^([^\[]+)\[(-?\d+|\*|'[^\']+')\]$/); if (bracketMatch) { var key = bracketMatch[1] || ''; var idx = bracketMatch[2]; var target = key ? (Array.isArray(node) ? node : (typeof node === 'object' && node !== null ? node[key] : undefined)) : node; if (target === undefined || target === null) return; if (idx === '*') { if (Array.isArray(target)) target.forEach(function(item) { walk(item, rest); }); else if (typeof target === 'object' && target !== null) Object.values(target).forEach(function(v) { walk(v, rest); }); } else if (idx.startsWith("'")) { var k = idx.slice(1, -1); if (typeof target === 'object' && target !== null && k in target) walk(target[k], rest); } else { var i = parseInt(idx, 10); if (Array.isArray(target) && i < target.length) walk(target[i < 0 ? target.length + i : i], rest); } return; } if (typeof node === 'object' && node !== null && seg in node) { walk(node[seg], rest); return; } if (Array.isArray(node)) { var found = false; for (var i = 0; i < node.length; i++) { if (typeof node[i] === 'object' && node[i] !== null && seg in node[i]) { walk(node[i][seg], rest); found = true; } } if (!found && !isNaN(parseInt(seg))) walk(node[parseInt(seg)], rest); } } walk(obj, parts); return result; } var jsonInput = document.getElementById('jsonInput'); var jpExpr = document.getElementById('jpExpr'); var output = document.getElementById('output'); var execBtn = document.getElementById('execBtn'); function run() { try { var doc = JSON.parse(jsonInput.value.trim()); var query = jpExpr.value.trim() || '$.'; var res = jp(query, doc); output.value = JSON.stringify(res.length === 1 && res.length !== doc.length ? res[0] : res, null, 2); } catch(e) { output.value = '错误: ' + e.message; } } execBtn.onclick = run; jpExpr.addEventListener('keydown', function(e) { if (e.key === 'Enter') run(); }); document.getElementById('copyOutput').onclick = function() { copyToClipboard(output.value); };