You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Zod解析含大数字的JSON值?无需依赖json-bigint可行吗?

用Zod解析包含大数字的JSON值(不依赖额外库)

首先得明确:JavaScript的Number类型只能精确表示2^53以内的整数,超过这个范围的数字用原生JSON.parse解析会直接丢失精度。所以要处理这类大数字,得先解决JSON解析阶段的精度问题,再结合Zod做验证转换。

具体实现步骤

1. 自定义JSON解析函数

不用json-bigint的话,自己写个reviver函数就能把超大数字转成字符串(避免精度丢失):

const parseJsonWithBigNumbers = (jsonStr) => {
  return JSON.parse(jsonStr, (key, value) => {
    // 识别超出安全整数范围的数字,转为字符串
    if (typeof value === 'number' && !Number.isSafeInteger(value)) {
      return value.toString();
    }
    return value;
  });
};

2. 用Zod定义Schema并验证转换

接下来用Zod把字符串格式的大数字转成BigInt(或者保留字符串,看你的业务需求):

import { z } from 'zod';

// 定义Schema:先接受字符串,再转为BigInt类型
const ItemSchema = z.object({
  id: z.string().transform(val => BigInt(val)),
});

// 目标JSON字符串(注意这里是标准JSON格式,键要加双引号)
const jsonStr = '{"id": 3458764513820541000}';
// 先解析JSON,把大数字转成字符串
const rawData = parseJsonWithBigNumbers(jsonStr);
// 用Zod验证并转换类型
const validatedData = ItemSchema.parse(rawData);

console.log(validatedData.id); // 输出 3458764513820541000n(BigInt类型)

3. 进阶:封装Zod自定义类型

如果经常用到大数字解析,可以把逻辑封装成Zod自定义类型,复用性更强:

// 自定义Zod类型:字符串转BigInt,同时做格式校验
const BigIntFromString = z.string()
  .refine(val => /^\d+$/.test(val), { message: '必须是有效的正数字符串' })
  .transform(val => BigInt(val));

// 直接用自定义类型定义Schema
const ItemSchema = z.object({
  id: BigIntFromString,
});

// 后续解析验证流程和之前一致
const result = ItemSchema.parse(parseJsonWithBigNumbers(jsonStr));

额外说明

  • 如果你的JSON里大数字本来就是字符串格式(比如{"id": "3458764513820541000"}),那跳过自定义解析函数,直接用Zod的z.string().transform(BigInt)就行。
  • 要是需要把BigInt转回字符串用于接口传输或存储,在Zod的transform里反向处理,或者在输出时手动转换即可。

内容的提问来源于stack exchange,提问作者Emre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:52:14