UNPKG

simple-json-order

Version:

A lightweight JavaScript utility to preserve the insertion order of top-level keys in JSON objects — ideal for config files, logs, or any use case where key order matters.

145 lines (115 loc) 3.1 kB
export class JSONOrder { constructor() { this.elements = new Map(); } add(id, value) { this.elements.set(String(id), value); } getAll() { return [...this.elements.entries()]; } get(id) { return this.elements.get(String(id)); } size() { return this.elements.size; } delete(id) { if (id) return this.elements.delete(String(id)); } stringify() { let i = 1; let mapSize = this.elements.size; let jsonString = ''; if (mapSize > 0) { jsonString = '{'; this.elements.forEach((val, k) => { jsonString += `"${k}": ${JSON.stringify(val)}`; if (i < mapSize) { jsonString += ','; i++; } }); jsonString += '}'; } return jsonString; } splitKeyFromValue(str) { const result = []; let braceDepth = 0; let bracketDepth = 0; let quote = false; let token = ''; for (let i = 0; i < str.length; i++) { const c = str[i]; if (c === '"' && str[i - 1] !== '\\') { quote = !quote; } else if (!quote) { if (c === '{') braceDepth++; if (c === '}') braceDepth--; if (c === '[') bracketDepth++; if (c === ']') bracketDepth--; if (c === ',' && braceDepth === 0 && bracketDepth === 0) { result.push(token); token = ''; continue; } } token += c; } if (token) result.push(token); return result; } parse(json) { //Make sure this can be parsed try{ JSON.parse(json); }catch(error) { console.log(`Error: ${json}`); return; } const finalMap = new Map(); const inner = json.slice(1, -1).trim(); if (!inner) return finalMap; const pairs = this.splitKeyFromValue(inner); for (const pair of pairs) { const [keyRaw, valueRaw] = pair.split(/:(.+)/); const key = keyRaw.trim().slice(1, -1); const value = JSON.parse(valueRaw); finalMap.set(key, value); } this.elements = finalMap; } prettyStringify() { let jsonString = this.stringify(); let finalString = ''; let indentLevel = 0; let inString = false; for (let i = 0; i < jsonString.length; i++) { const char = jsonString[i]; if (char === '"' && jsonString[i - 1] !== '\\') { inString = !inString; } if (!inString) { if (char === '{' || char === '[') { finalString += char + '\n' + '\t'.repeat(++indentLevel); continue; } if (char === '}' || char === ']') { finalString += '\n' + '\t'.repeat(--indentLevel) + char; continue; } if (char === ',') { finalString += char + '\n' + '\t'.repeat(indentLevel); continue; } if (char === ':') { finalString += ': '; continue; } } finalString += char; } return finalString; } }