如何使用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
相关产品推荐
相关产品推荐

