← ToolBox
/ .properties 解析器
🌙
⚙️ .properties 解析器
Java .properties 文件解析:支持 key=value、key:value、行内注释、行尾反斜杠续行。
解析为 JSON
美化
压缩
复制
清空
示例
输出
等待解析...
已复制
const SAMPLE = '# Application properties\napp.name = toolbox\napp.version = 1.0\napp.debug = false\n\n# Database\ndb.host = localhost\ndb.port = 5432\ndb.url = jdbc:postgresql://localhost:5432/app\ndb.pool.max = 20\ndb.pool.min = 5'; function parseProps(text){ const result = {}; let lines = text.split('\n'); let i = 0; while(i < lines.length){ let line = lines[i]; i++; let t = line.trim(); if(!t || t.startsWith('#') || t.startsWith('!')) continue; while(line.endsWith('\\') && i < lines.length){ line = line.slice(0, -1) + lines[i].trim(); i++; } t = line; let sep = -1; for(let j = 0; j < t.length; j++){ if(t[j] === '=' || t[j] === ':'){ sep = j; break; } if(t[j] === ' ' || t[j] === '\t' || t[j] === '\\'){ if(j > 0) break; } } let k, v; if(sep < 0){ k = t.trim(); v = ''; } else { k = t.slice(0, sep).trim(); v = t.slice(sep + 1).trim(); } result[unescapeKey(k)] = unescapeVal(v); } return result; } function unescapeKey(s){ return s.replace(/\\=/g, '=').replace(/\\:/g, ':').replace(/\\ /g, ' ').replace(/\\\\/g, '\\'); } function unescapeVal(s){ return s.replace(/\\n/g, '\n').replace(/\\t/g, '\t').replace(/\\=/g, '=').replace(/\\:/g, ':').replace(/\\\\/g, '\\'); } function escapeKey(s){ return s.replace(/\\/g,'\\\\').replace(/=/g,'\\=').replace(/:/g,'\\:'); } function escapeVal(s){ return String(s).replace(/\\/g,'\\\\').replace(/\n/g,'\\n').replace(/\t/g,'\\t'); } function toProps(obj){ return Object.keys(obj).map(k => escapeKey(k) + ' = ' + escapeVal(obj[k])).join('\n'); } function propsToJson(){ setErr(''); try{ setOut(JSON.stringify(parseProps(document.getElementById('input').value), null, 2)); setErr('✅ 解析成功'); }catch(e){ setErr('❌ ' + e.message); } } function doBeautify(){ setErr(''); try{ const text = document.getElementById('input').value; if(text.trim().startsWith('{')) setOut(toProps(JSON.parse(text))); else setOut(toProps(parseProps(text))); setErr('✅ 美化成功'); }catch(e){ setErr('❌ ' + e.message); } } function doMinify(){ setErr(''); try{ const text = document.getElementById('input').value; if(text.trim().startsWith('{')) setOut(toProps(JSON.parse(text)).replace(/\n/g,'\n')); else setOut(Object.entries(parseProps(text)).map(([k,v]) => k + '=' + v).join('\n')); setErr('✅ 压缩成功'); }catch(e){ setErr('❌ ' + e.message); } } function loadSample(){document.getElementById('input').value = SAMPLE; propsToJson();} 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();}