Using Zod to Parse a JSON String

November 18th, 2024

·

1 min read

I recently needed to parse a JSON string in TypeScript and validate the shape of the data. I discovered a neat utility that allowed me to handle both steps in one go.

import { z } from "zod";

const stringToJSONSchema = z.string().transform((str, ctx) => {
try {
return JSON.parse(str);
} catch (e) {
ctx.addIssue({ code: "custom", message: "Invalid JSON" });
return z.NEVER;
}
});

export const MyDataSchema = z.object({
foo: z.string(),
bar: z.number(),
});

const jsonString = '{"foo": "hello", "bar": 42}';

const result = stringToJSONSchema.pipe(MyDataSchema).safeParse(jsonString);