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");

注意:在安全/严格模式下,使用 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:nodepnpm run bench:bun

许可

MIT。倾情打造 💖