首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Zod“深度”解析包含JSON字符串的架构?

如何使用Zod“深度”解析包含JSON字符串的架构?
EN

Stack Overflow用户
提问于 2022-09-02 09:04:30
回答 2查看 66关注 0票数 2

我使用佐德来验证包含JSON数据的HTTP。目前,我使用的模式如下(简化,以提高可读性):

代码语言:javascript
运行
复制
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({ payload: z.string() })
// ...

const req = requestSchema.parse(request)
const raw = JSON.parse(req.payload)
const payload = payloadSchema.parse(raw)

console.log(payload.name) // << this is what I'm interested into

Zod是否提供了一种更直接的方式来深入解析包含我不知道的JSON字符串的形状?

代码语言:javascript
运行
复制
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({ payload: z.string().json(payloadSchema) })
// ...

const req = requestSchema.parse(request)
console.log(req.payload.name) // << this is what I'm interested into
EN

回答 2

Stack Overflow用户

发布于 2022-09-02 09:29:42

我认为如果json还没有被解析的话,你的做法是唯一的方法。奇怪的是,您会有一个作为对象的请求模式(可能是检查从调用HTTP调用的库中返回的请求对象),但有效负载尚未被解析。

下面是代码示例的runkit:https://runkit.com/robert-rendell-the/6311cbb991ef9900086d4971

一些库(Nest.js)将在HTTP请求到达时解析有效负载,因此不需要json解析步骤

我假设这就是你的请求到达时的样子:

代码语言:javascript
运行
复制
{ payload: "{ name: '', age: 18}" }

理想情况下,您希望像Nest这样的东西来执行解析,这样zod模式/ zod解析就像下面这样直接:

代码语言:javascript
运行
复制
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({ payload: payloadSchema })
// ...


const req = requestSchema.parse({ payload: { name: '', age: 18}})
console.log(req.payload.name)
票数 1
EN

Stack Overflow用户

发布于 2022-09-06 11:58:45

根据佐德作者的回应,载于GitHub (这里)

这里推荐的方法是在验证之前使用预处理来解析有效负载。

代码语言:javascript
运行
复制
const z = require('zod')
const payloadSchema = z.object({ name: z.string(), age: z.number().min(18) })
const requestSchema = z.object({
  payload: z.preprocess((val) => JSON.parse(val), payloadSchema),
})

const req = requestSchema.parse({payload:'{"name": "Beth", "age": 20}'})
// req.payload.name === Beth
// req.payload.age === 20

(为清晰起见编辑的代码)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73580183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档