← ToolBox
/ JSON 转 YAML
🌙
📄 JSON 转 YAML
将 JSON 转换为 YAML 1.2 子集格式,支持嵌套对象、数组、字符串、数字、布尔和 null。
美化
压缩
校验
复制
清空
示例
缩进
2 空格
4 空格
Tab
YAML 输出
等待转换...
已复制
const SAMPLE = JSON.stringify({app:"ToolBox",version:1.0,debug:true,tags:["util","dev"],database:{host:"localhost",port:5432,pool:10},features:[{name:"a",enabled:true},{name:"b",enabled:false}]}, null, 2); function toYaml(v, indent){ indent = indent || 0; const pad = ' '.repeat(indent); if(v === null) return 'null'; if(typeof v === 'boolean' || typeof v === 'number') return String(v); if(typeof v === 'string'){ if(/^[\d.]+$/ .test(v) || ['true','false','null','yes','no','~'].includes(v.toLowerCase())) return JSON.stringify(v); if(/[\n:#[\]{}&*!|>'"%@`]/.test(v) || v.trim() !== v || v.includes(', ')) return JSON.stringify(v); return v; } if(Array.isArray(v)){ if(v.length === 0) return '[]'; return v.map(item => pad + '- ' + (typeof item === 'object' && item !== null ? '\n' + toYaml(item, indent + 1) : toYaml(item, 0))).join('\n'); } if(typeof v === 'object'){ const keys = Object.keys(v); if(keys.length === 0) return '{}'; return keys.map(k => pad + k + ': ' + (typeof v[k] === 'object' && v[k] !== null ? (Array.isArray(v[k]) && v[k].length === 0 ? '[]' : Object.keys(v[k]).length === 0 ? '{}' : '\n' + toYaml(v[k], indent + 1)) : toYaml(v[k], 0))).join('\n'); } return String(v); } function doYaml(){ setErr(''); try{ const data = JSON.parse(document.getElementById('input').value); setOut('---\n' + toYaml(data, 0)); setErr('✅ 转换成功'); }catch(e){ setErr('❌ ' + e.message); } } function doMinYaml(){ setErr(''); try{ const data = JSON.parse(document.getElementById('input').value); const yaml = toYaml(data, 0).split('\n').map(l => l.trim()).filter(l => l).join('\n'); setOut('---\n' + yaml); setErr('✅ 压缩转换'); }catch(e){ setErr('❌ ' + e.message); } } function loadSample(){document.getElementById('input').value = SAMPLE; doYaml();} function getIndent(){return ' ';} 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 doValidate(){ doYaml(); } 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();}