JSON 数据验证:技术方案与工具对比

validationjsonschematypescript

验证 JSON 数据对应用可靠性至关重要。本指南对比最流行的验证方案。

为什么需要验证 JSON?

没有验证,无效数据可能:

  • 导致运行时错误
  • 损坏数据库
  • 造成安全漏洞
  • 破坏 API 契约
  • JSON Schema

    JSON 验证的官方标准:

    {

    "$schema": "https://json-schema.org/draft/2020-12/schema",

    "type": "object",

    "properties": {

    "name": { "type": "string", "minLength": 1 },

    "email": { "type": "string", "format": "email" },

    "age": { "type": "integer", "minimum": 0 }

    },

    "required": ["name", "email"]

    }

    优点: 语言无关、标准规范、适合 API 文档

    缺点: 冗长、简单场景过于复杂

    Zod (TypeScript)

    import { z } from 'zod';

    const UserSchema = z.object({

    name: z.string().min(1),

    email: z.string().email(),

    age: z.number().int().positive().optional()

    });

    const user = UserSchema.parse(input);

    // 类型安全的输出!

    优点: TypeScript 集成、简洁、出色的错误信息

    缺点: 仅限 JavaScript/TypeScript

    Joi (Node.js)

    const Joi = require('joi');

    const schema = Joi.object({

    name: Joi.string().required(),

    email: Joi.string().email(),

    age: Joi.number().integer().min(0)

    });

    const { error, value } = schema.validate(input);

    优点: 丰富的 API、成熟稳定、详细的错误信息

    缺点: 侧重 Node.js、包体积较大

    Ajv (JSON Schema 验证器)

    const Ajv = require('ajv');

    const ajv = new Ajv();

    const valid = ajv.validate(schema, data);

    if (!valid) console.log(ajv.errors);

    优点: 最快的 JSON Schema 验证器、符合标准

    缺点: 仅支持 Schema、无 TypeScript 推断

    选择验证器

    | 需求 | 最佳选择 |

    |------|---------|

    | API 契约 | JSON Schema + Ajv |

    | TypeScript 项目 | Zod |

    | Express/Hapi 服务器 | Joi |

    | 最大性能 | Ajv |

    | 客户端表单 | Zod (配合 React Hook Form) |

    始终使用我们的 JSON 验证器 作为第一步来验证 JSON 数据。

    相关工具