Skip to content
Sarj Code Standards

no-generic-json-parser

Parse known JSON fields with an object schema instead of an open JSON or record parser.

Why

An open JSON parser checks serialization or value kinds without declaring required fields, leaving application reads outside the validation contract.

Fix

Define a focused z.object schema for the fields being read and infer its output type. Keep generic JSON at deliberate opaque forwarding or storage boundaries.

Examples

Before — flagged Generic validation does not declare the field
src/request.ts
import { z } from "zod";
const JsonSchema = z.record(z.string(), z.unknown());
function load(raw: unknown) {
const body = JsonSchema.parse(raw);
return body.version;
}
After — preferred Declare only the fields being read
src/request.ts
import { z } from "zod";
const VersionSchema = z.object({ version: z.number().int().positive() });
function load(raw: unknown) {
return VersionSchema.parse(raw).version;
}
Before — flagged Validate the fields consumed after success — before
src/example.ts
import { z } from "zod";
function load(raw: unknown) {
const result = z.record(z.string(), z.unknown()).safeParse(raw);
if (!result.success) return;
return result.data.id;
}
After — preferred Validate the fields consumed after success — after
src/example.ts
import { z } from "zod";
function load(raw: unknown) {
const result = z.object({ id: z.string() }).safeParse(raw);
if (!result.success) return;
return result.data.id;
}

References