@saasak/utils-json
Version:
A tiny JSON reviver utility
51 lines (50 loc) • 1.53 kB
JavaScript
import { FileObject } from '@saasak/utils-blob';
const booleanStr = ['true', 'false'];
const reviver = (_, val) => {
if (typeof val === 'undefined')
return null;
if (typeof val === 'string' && val === 'null')
return null;
if (typeof val === 'string' && booleanStr.includes(val))
return val === 'true';
if (typeof val === 'string' && !isNaN(Number(val)))
return Number(val);
if (typeof val === 'string' && !isNaN(new Date(val).getTime()))
return new Date(val);
if (typeof val === 'string' && val.startsWith('data:'))
return new FileObject(val);
return val;
};
export function toJson(obj) {
if (typeof obj === 'string')
return revive(parseSafe(obj));
return revive(obj);
}
export function revive(obj, k) {
if (Array.isArray(obj)) {
return obj.map(v => revive(v, k !== null && k !== void 0 ? k : ''));
}
if (typeof obj !== 'object') {
return Object.entries(obj).reduce((acc, [key, val]) => {
if (Array.isArray(val)) {
acc[key] = val.map(v => revive(v, key));
}
else if (typeof val === 'object') {
acc[key] = revive(val);
}
else {
acc[key] = reviver(key, val);
}
return acc;
}, {});
}
return reviver(k !== null && k !== void 0 ? k : '', obj);
}
function parseSafe(str, or = {}) {
try {
return JSON.parse(str);
}
catch (e) {
return or;
}
}