JSON格式校验需先用JSON.parse()解析并捕获SyntaxError,再对解析后的JS值用typeof、Array.isArray等检查字段类型;复杂场景应使用JSON Schema+ajv统一校验。

JavaScript 中校验 JSON 字符串本身是否格式合法,和校验解析后数据中**字段类型是否符合业务预期**,是两个不同阶段的任务。前者看“是不是合法 JSON”,后者看“是不是你想要的 JSON 结构”。不能跳过解析直接用正则判断字段类型——那既不可靠,也做不到。
先确保是合法 JSON:必须用 JSON.parse()
任何字段类型校验都建立在成功解析的基础上。不先解析,就无从知道字段是什么类型。
- 调用 JSON.parse(str) 尝试解析字符串
- 用 try...catch 捕获 SyntaxError —— 解析失败说明不是有效 JSON,字段校验无意义
- 解析成功返回的是 JavaScript 值(对象、数组等),此时才能安全访问属性并检查类型
解析后校验字段类型:用 typeof 和 instanceof 等原生方式
拿到解析后的 JS 值(比如一个对象 obj),就可以逐字段判断类型了。例如要求:{"name": "Alice", "age": 25, "tags": ["a","b"], "meta": null} 中 name 是字符串、age 是数字、tags 是数组、meta 是 null。
-
字符串:
typeof obj.name === 'string' && obj.name.trim() !== '' -
数字(且为有限整数):
Number.isInteger(obj.age) && obj.age >= 0 -
数组:
Array.isArray(obj.tags) -
null:
obj.meta === null(注意不用 typeof,因为 typeof null === 'object') -
布尔值:
typeof obj.active === 'boolean' -
嵌套对象:
obj.address && typeof obj.address === 'object' && !Array.isArray(obj.address)
需要结构化、可复用的字段校验?用 JSON Schema
当接口契约明确(比如后端文档规定了每个字段的类型、是否必填、取值范围),推荐引入 JSON Schema + 校验库(如 ajv)。
- 定义一个 schema 描述期望结构,例如:
{ "type": "object", "properties": { "id": { "type": "integer" }, "email": { "type": "string", "format": "email" } }, "required": ["id"] } - 用
ajv.compile(schema)(data)一次性校验全部字段类型、必填项、格式(邮箱/日期)、范围等 - 错误信息清晰,支持 i18n,适合表单提交、API 响应校验等场景
避免踩坑:这些常见误操作要绕开
- ❌ 用正则匹配
"age":\s*\d+判断 age 是数字 —— 无法区分"age": "123"(字符串)和"age": 123(数字),更无法处理负数、小数、科学计数法 - ❌ 用
obj.age > 0替代类型检查 —— 如果 age 是字符串"25",会隐式转为数字;如果是null或undefined,结果为false,但没暴露类型错误 - ❌ 忽略
null的特殊性 —— 它是独立类型,typeof null错误地返回'object',必须用全等=== null - ❌ 把校验逻辑写死在 if 分支里 —— 字段一多就难以维护,建议封装成函数或使用 Schema
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











