Logo of destr

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:nodepnpm run bench:bun 自行运行!

许可

MIT。倾情打造 💖