nope/lib/helpers/jsonMethods.ts

76 lines
2.3 KiB
TypeScript
Raw Normal View History

/**
* Function to stringify an Object. This Function will stringify Functions as well.
* @param obj The Object.
*/
export function stringifyWithFunctions(obj) {
return JSON.stringify(obj, (key, value) => {
if (typeof value === "function") {
let str: string = value.toString();
// Todo Parse Arrow-Functions Correctly!
// Details here: https://zendev.com/2018/10/01/javascript-arrow-functions-how-why-when.html
// Difference Cases For:
// 1) (a, b) => a + b;
// 2) array => array[0];
// 3) (a, b) => (a + b);
// 4) (name, description) => ({name: name, description: description})
// ....
if (!str.startsWith('function') && !str.startsWith('(')) {
const name = str.slice(0, str.indexOf('=>'));
const func = str.slice(str.indexOf('=>(') + 3, str.length - 2)
const adaptedFunc = 'function(' + name + '){ return ' + func + '; }';
str = adaptedFunc;
}
return "/Function(" + str + ")/";
}
return value;
});
}
/**
* Function to parse a JSON String, in which methods should be available.
* @param json A String containing the json Object
*/
export function parseWithFunctions(json: string) {
return JSON.parse(json, (key, value) => {
if (typeof value === "string" &&
value.startsWith("/Function(") &&
value.endsWith(")/")) {
const _value = value.substring(10, value.length - 2);
try {
return eval("(" + _value + ")");
} catch (e) {
console.log('FAILED PARSING', value, _value)
}
}
return value;
});
}
/**
* Function to stringify an Object. This Function is able to stringify Functions as well. Use the Flag withFunctions
* @param obj The Object.
* @param withFunctions Flag to Turn on / off the parsing of functions
*/
export function stringify(obj: any, withFunctions = false): string {
if (withFunctions) {
return stringifyWithFunctions(obj);
}
return JSON.stringify(obj);
}
/**
* Function to parse a JSON String. This Function is able to parse Functions as well. Use the Flag withFunctions
* @param json A String containing the json Object
* @param withFunctions Flag to Turn on / off the parsing of functions
*/
export function parse(json: string, withFunctions = false): any {
if (withFunctions) {
return parseWithFunctions(json);
}
return JSON.parse(json);
}