@pipedream/metabase
Version:
Pipedream Metabase Components
52 lines (47 loc) • 1.18 kB
JavaScript
const parseJson = (input, maxDepth = 100) => {
const seen = new WeakSet();
const parse = (value) => {
if (maxDepth <= 0) {
return value;
}
if (typeof(value) === "string") {
// Only parse if the string looks like a JSON object or array
const trimmed = value.trim();
if (
(trimmed.startsWith("{") && trimmed.endsWith("}")) ||
(trimmed.startsWith("[") && trimmed.endsWith("]"))
) {
try {
return parseJson(JSON.parse(value), maxDepth - 1);
} catch (e) {
return value;
}
}
return value;
} else if (typeof(value) === "object" && value !== null) {
if (seen.has(value)) {
return value;
}
seen.add(value);
return Object.entries(value)
.reduce((acc, [
key,
val,
]) => Object.assign(acc, {
[key]: parse(val),
}), {});
}
return value;
};
return parse(input);
};
function parseArray(input, maxDepth = 100) {
if (!Array.isArray(input)) {
return input;
}
return input.map((item) => parseJson(item, maxDepth));
}
export default {
parseArray,
parseJson,
};