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

如何用Zod Schema验证一级至N级嵌套数据结构?

解决方案

问题出在你定义的嵌套结构上——你的nestedSchema用了固定的child键,但实际数据是用动态键名来实现层级嵌套的,而非固定属性名。

正确的做法是定义一个递归的Zod Schema,允许每个节点要么是包含title的叶子对象,要么是一个由动态键名组成的、值为该递归Schema的对象。

正确代码实现

import { z } from "zod";

// 递归定义节点Schema:要么是叶子节点(带title),要么是分支节点(动态键映射到节点)
const NodeSchema = z.union([
  z.object({ title: z.string() }),
  z.record(z.lazy(() => NodeSchema))
]);

// 顶层Schema是动态键映射到节点的对象
const TestSchema = z.record(NodeSchema);

// 验证测试数据
const isValid = TestSchema.safeParse(testData);

if (!isValid.success) {
  console.log("error", isValid.error);
} else {
  console.log("success");
}

代码说明

  1. 递归Schema:使用z.lazy()来实现递归引用,避免Zod在初始化时找不到未定义的Schema。
  2. Union类型:每个节点可以是两种类型之一:
    • 叶子节点:{ title: string },对应一级数据。
    • 分支节点:Record<string, NodeSchema>,对应N级嵌套的动态键结构。
  3. 顶层验证:顶层是一个Record<string, NodeSchema>,完美匹配你的测试数据结构。

这个Schema可以兼容任意层级的嵌套数据,无论是一级、二级还是更深的层级,只要每个叶子节点都包含title字符串即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:31:12