使用Zod解析外部JSON文件时遭遇类型错误求助
解决Zod解析外部JSON文件时的类型错误问题
问题核心原因很明确:
readFileSync默认返回Buffer对象(未指定编码参数时),就算文件内容是JSON格式,本质也是未解析的原始文本,而Zod的schema.parse()只接受解析后的JavaScript对象,不接受原始字符串/Buffer。- 你代码里的
dataExternalZod直接把未解析的rawData传给Zod,自然触发类型错误——Zod收到的是字符串/Buffer,不是预期的对象。
解决方案1:先解析JSON再校验
先读取文件内容(指定编码直接拿到字符串),用JSON.parse转换成对象后再传给Zod:
import { readFileSync } from 'fs'; import { z } from "zod"; const schema = z.object({ foo: z.string() }); // 指定utf8编码读取,直接获取字符串 const rawData = readFileSync('data.json', 'utf8'); // 解析成JS对象 const parsedData = JSON.parse(rawData); // 用Zod校验 const dataExternalZod = schema.parse(parsedData); // 正常运行
解决方案2:合并步骤更简洁
把读取、解析、校验合并成一行代码,减少冗余:
import { readFileSync } from 'fs'; import { z } from "zod"; const schema = z.object({ foo: z.string() }); const dataExternalZod = schema.parse(JSON.parse(readFileSync('data.json', 'utf8')));
补充说明:为什么JSON.parse(rawData)能正常运行?因为JSON.parse支持直接传入Buffer,它会自动将Buffer转换为字符串再解析。但Zod的校验逻辑不会做这种自动转换,它严格遵循你定义的schema类型,所以必须传入解析完成的对象。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

