destr
JSON.parse 的更快、更安全、更便捷的替代方案。
一个更快、更安全、更方便的 JSON.parse
替代方案。
用法
Node.js
安装依赖
# npm
npm i destr
# yarn
yarn add destr
# pnpm
pnpm i destr
导入到您的 Node.js 项目
// ESM
import { destr, safeDestr } from "destr";
// CommonJS
const { destr, safeDestr } = require("destr");
Deno
import { destr, safeDestr } from "https://deno.land/x/destr/src/index.ts";
console.log(destr('{ "deno": "yay" }'));
为什么?
✅ 类型安全
const obj = JSON.parse("{}"); // obj type is any
const obj = destr("{}"); // obj type is unknown by default
const obj = destr<MyInterface>("{}"); // obj is well-typed
✅ 如果输入不是字符串,则快速回退到输入本身
// Uncaught SyntaxError: Unexpected token u in JSON at position 0
JSON.parse();
// undefined
destr();
✅ 对已知字符串值进行快速查找
// Uncaught SyntaxError: Unexpected token T in JSON at position 0
JSON.parse("TRUE");
// true
destr("TRUE");
✅ 如果解析失败(空字符串或任意普通字符串),则回退到原始值
// Uncaught SyntaxError: Unexpected token s in JSON at position 0
JSON.parse("salam");
// "salam"
destr("salam");
注意:在 safe/strict 模式下使用 safeDestr
时会导致此项失败。
✅ 避免原型链污染
const input = '{ "user": { "__proto__": { "isAdmin": true } } }';
// { user: { __proto__: { isAdmin: true } } }
JSON.parse(input);
// { user: {} }
destr(input);
✅ 严格模式
当使用 safeDestr
时,如果输入不是有效的 JSON 字符串或解析失败,它将抛出错误。(非字符串值和内置类型仍将按原样返回)
// Returns "[foo"
destr("[foo");
// Throws an error
safeDestr("[foo");
基准测试
对于任意输入,destr
通常比 JSON.parse
更快,但有时在解析有效 JSON 字符串时会稍慢一些,这主要是因为为了避免 原型链污染 而进行的转换,如果未进行净化处理,这可能导致严重的安全问题。换句话说,当输入不总是 JSON 字符串或来自不受信任的源(如请求体)时,destr
的表现更好。
查看 基准测试结果 或通过运行 pnpm run bench:node
或 pnpm run bench:bun
自行运行!
许可
MIT。倾情打造 💖