Zod能否解析JSON文件内容?能否直接解析JSON字符串仅抛Zod错误?
问题
我编写了一个函数createConfigurationFromJson,它接收一个JSON字符串,并通过Zod Schema将其解析为指定的Configuration类型,代码如下:
const createConfigurationFromJson = (content: string): Configuration => { const rawConfiguration = JSON.parse(content); return configurationSchema.parse(rawConfiguration); };
当前该函数可能因JSON内容无效或Zod解析失败抛出异常。请问在不使用其他第三方库的情况下,能否让Zod直接解析JSON字符串,确保仅抛出Zod相关的错误?
解决方案
Zod本身没有提供直接解析JSON字符串的API,但可以通过捕获JSON.parse的错误并转换为Zod标准错误类型,实现仅抛出Zod相关错误的效果:
- 用
try/catch包裹JSON.parse调用,捕获JSON格式错误 - 将捕获到的JSON错误包装成
ZodError实例,和Zod校验失败的错误统一格式 - 保留Zod原有的
parse逻辑完成对象校验
修改后的代码示例:
import { ZodError, z } from "zod"; // 示例Configuration Schema const configurationSchema = z.object({ apiUrl: z.string().url(), timeout: z.number().positive(), }); type Configuration = z.infer<typeof configurationSchema>; const createConfigurationFromJson = (content: string): Configuration => { let rawData: unknown; try { rawData = JSON.parse(content); } catch (jsonError) { // 把JSON解析错误转为ZodError throw new ZodError([ { code: "custom", message: `无效的JSON格式: ${(jsonError as Error).message}`, path: [], }, ]); } return configurationSchema.parse(rawData); };
修改后,无论JSON格式错误还是Zod校验失败,都会抛出ZodError类型的异常,实现了仅抛出Zod相关错误的需求。
内容的提问来源于stack exchange,提问作者baitendbidz
相关产品推荐
相关产品推荐

