@jhqn/utils-core 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +28 -23
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -349,38 +349,43 @@ const isError = (val) => getVariableType(val) === "error";
|
|
|
349
349
|
* @param {any} val 检测的目标
|
|
350
350
|
*/
|
|
351
351
|
const isDef = (val) => !isNull(val) && !isUndefined(val);
|
|
352
|
+
const INVALID_JSON = Symbol("invalid_json");
|
|
353
|
+
const JSON_LITERAL_PREFIXES = {
|
|
354
|
+
t: "true",
|
|
355
|
+
f: "false",
|
|
356
|
+
n: "null"
|
|
357
|
+
};
|
|
358
|
+
const parseJSONLikeStr = (str) => {
|
|
359
|
+
if (!isDef(str)) return INVALID_JSON;
|
|
360
|
+
const normalized = str.trim();
|
|
361
|
+
if (normalized === "") return INVALID_JSON;
|
|
362
|
+
const firstChar = normalized[0];
|
|
363
|
+
if (!"{[\"tfn-0123456789".includes(firstChar)) return INVALID_JSON;
|
|
364
|
+
if (firstChar in JSON_LITERAL_PREFIXES) {
|
|
365
|
+
const literal = JSON_LITERAL_PREFIXES[firstChar];
|
|
366
|
+
if (!normalized.startsWith(literal)) return INVALID_JSON;
|
|
367
|
+
const nextChar = normalized[literal.length];
|
|
368
|
+
if (isDef(nextChar) && !",]} \r\n".includes(nextChar)) return INVALID_JSON;
|
|
369
|
+
}
|
|
370
|
+
try {
|
|
371
|
+
return JSON.parse(normalized);
|
|
372
|
+
} catch (e) {
|
|
373
|
+
jWarn("Failed to parse invalid string", e);
|
|
374
|
+
return INVALID_JSON;
|
|
375
|
+
}
|
|
376
|
+
};
|
|
352
377
|
/**
|
|
353
378
|
* 判断是否合法JSON字符串
|
|
354
379
|
* @param str
|
|
355
380
|
*/
|
|
356
|
-
const isJSONStr = (str) =>
|
|
357
|
-
if (isDef(str)) {
|
|
358
|
-
const normalized = str.trim();
|
|
359
|
-
if (normalized === "") return false;
|
|
360
|
-
const firstChar = normalized[0];
|
|
361
|
-
if (!"{[\"tfn-0123456789".includes(firstChar)) return false;
|
|
362
|
-
try {
|
|
363
|
-
JSON.parse(normalized);
|
|
364
|
-
return true;
|
|
365
|
-
} catch (e) {
|
|
366
|
-
jWarn("Failed to parse invalid string", e);
|
|
367
|
-
return false;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return false;
|
|
371
|
-
};
|
|
381
|
+
const isJSONStr = (str) => parseJSONLikeStr(str) !== INVALID_JSON;
|
|
372
382
|
/**
|
|
373
383
|
* 判断是否合法JSON数组字符串
|
|
374
384
|
* @param str
|
|
375
385
|
*/
|
|
376
386
|
const isArrStr = (str) => {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
} catch (e) {
|
|
380
|
-
jWarn("Failed to parse invalid string", e);
|
|
381
|
-
return false;
|
|
382
|
-
}
|
|
383
|
-
return false;
|
|
387
|
+
const parsed = parseJSONLikeStr(str);
|
|
388
|
+
return parsed !== INVALID_JSON && isArray(parsed);
|
|
384
389
|
};
|
|
385
390
|
/**
|
|
386
391
|
* 判断是否有效的key
|