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");
注意:在安全/严格模式下,使用 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 字符串时会比 JSON.parse 慢一点,这主要是因为进行了转换以避免 原型污染,如果不进行清理,这可能导致严重的安全问题。换句话说,当输入不总是 JSON 字符串或来自不受信任的来源(如请求正文)时,destr 更优。
查看 基准测试结果 或自行运行 pnpm run bench:node 或 pnpm run bench:bun!
许可
MIT。倾情打造 💖