Skip to content

Safe Parse

JSON x Zod (Schema Validation)

safeParse.ts

ts
import { z } from "zod";

export const safeParse = <T extends z.ZodType>(value: string, schema: T): z.infer<T> => {
  try {
    const data = JSON.parse(value);
    return schema.parse(data);
  } catch (err) {
    if (err instanceof z.ZodError) {
      throw new Error("Validation Error");
    }
    throw new Error("Parsing Failure");
  }
};

safeParse.spec.ts

ts
import { z } from "zod";
import { safeParse } from "./safeParse";

describe("safeParse", () => {
  const accessTokenSchema = z.object({
    access_token: z.string(),
    expires_in: z.number()
  });

  type AccessToken = z.infer<typeof accessTokenSchema>;

  it("should (safe) parse json", () => {
    const str = `
      {
        "access_token": "eyJiZWFyZXIiOiJ0b2tlbiJ9",
        "expires_in": 300
      }
    `;

    const data: AccessToken = safeParse(str, accessTokenSchema);
    expect(data.access_token).toEqual("eyJiZWFyZXIiOiJ0b2tlbiJ9");
    expect(data.expires_in).toEqual(300);
  });

  it("should throw an (validation) error", () => {
    const str = `
      {
        "bearer_token": "eyJiZWFyZXIiOiJ0b2tlbiJ9",
        "expires_in": "300"
      }
    `;

    expect(() => safeParse(str, accessTokenSchema)).toThrow("Validation Error");
  });
});

Released under the MIT License.