📊 JSON 转 TSV

将 JSON 对象数组转换为 TSV(Tab 分隔值),自动提取字段为表头。

等待转换...
已复制
const SAMPLE = JSON.stringify([{id:1,name:"Alice",age:30,active:true},{id:2,name:"Bob",age:25,active:false},{id:3,name:"Carol",age:35,active:true}], null, 2); function escapeTsv(v){ return String(v == null ? '' : v).replace(/\t/g, ' ').replace(/\r?\n/g, ' '); } function convert(){ setErr(''); try{ const data = JSON.parse(document.getElementById('input').value); if(!Array.isArray(data)) throw new Error('需要 JSON 数组'); const keys = []; data.forEach(item => { if(item && typeof item === 'object') for(const k in item) if(!keys.includes(k)) keys.push(k); }); const lines = []; if(document.getElementById('header').checked) lines.push(keys.join('\t')); data.forEach(item => lines.push(keys.map(k => escapeTsv(item ? item[k] : '')).join('\t'))); setOut(lines.join('\n')); setErr('✅ ' + data.length + ' 行,' + keys.length + ' 列'); }catch(e){ setErr('❌ ' + e.message); } } function loadSample(){document.getElementById('input').value = SAMPLE; convert();} function setOut(s){document.getElementById('output').textContent = s;} function setErr(s){const e = document.getElementById('err'); e.textContent = s || ''; e.className = 'err' + (s && s.startsWith('✅') ? ' ok' : '');} function clearAll(){document.getElementById('input').value = ''; setOut('等待转换...'); setErr('');} function getIndent(){const v=document.getElementById('indent').value;return v==='tab'?'\t':' '.repeat(parseInt(v));} function setOut(s){document.getElementById('output').textContent=s;} function setErr(s){const e=document.getElementById('err');e.textContent=s||'';e.className='err'+(s?'':' ok');} function clearAll(){document.getElementById('input').value='';setOut('等待输入...');setErr('');} function loadSample(){document.getElementById('input').value=SAMPLE;doBeautify();}