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
JavaScript
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;
}
}