UNPKG

@saasak/utils-json

Version:

A tiny JSON reviver utility

51 lines (50 loc) 1.53 kB
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; } }