@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
47 lines (46 loc) • 1.38 kB
JavaScript
import { JsonParseError } from '../error/error.util.js';
// const possibleJsonStartTokens = ['{', '[', '"']
const DETECT_JSON = /^\s*[{["\-\d]/;
/**
* Attempts to parse object as JSON.
* Returns original object if JSON parse failed (silently).
*/
export function _jsonParseIfPossible(obj, reviver) {
// Optimization: only try to parse if it looks like JSON: starts with a json possible character
if (typeof obj === 'string' && obj && DETECT_JSON.test(obj)) {
try {
return JSON.parse(obj, reviver);
}
catch { }
}
return obj;
}
/**
* Convenience function that does JSON.parse, but doesn't throw on error,
* instead - safely returns `undefined`.
*/
export function _jsonParseOrUndefined(obj, reviver) {
// Optimization: only try to parse if it looks like JSON: starts with a json possible character
if (typeof obj === 'string' && obj && DETECT_JSON.test(obj)) {
try {
return JSON.parse(obj, reviver);
}
catch { }
}
}
/**
* Same as JSON.parse, but throws JsonParseError:
*
* 1. It's message includes a piece of source text (truncated)
* 2. It's data.text contains full source text
*/
export function _jsonParse(s, reviver) {
try {
return JSON.parse(s, reviver);
}
catch {
throw new JsonParseError({
text: s,
});
}
}