判断变量是否符合JSON序列化要求,核心是其能否被安全无损转换为标准JSON字符串且符合RFC 8259规范:仅支持数字(非NaN/Infinity)、双引号字符串、true/false布尔值、数组、对象(键名须双引号)和null;undefined、函数、Date等非法类型会出错或被忽略;需避免循环引用、重复键名及非字符串键名;验证应以默认序列化行为为准,如JS中JSON.stringify不抛错且JSON.parse可逆。

判断一个变量是否符合JSON序列化要求,核心是看它能否被安全、无损地转换为标准JSON字符串,且不违反RFC 8259规范。这不只是“能转成字符串”,更需关注类型合法性、结构完整性与编码合规性。
看数据类型是否在JSON原生支持范围内
JSON只直接支持以下几种基础类型:
- 数字(整数或浮点数,不能是NaN、Infinity或负无穷)
- 字符串(必须用双引号包裹,不可用单引号或反引号)
- 布尔值(
true或false,不是字符串"true") - 数组(方括号包裹的有序值列表)
- 对象(花括号包裹的键值对,所有键名必须是双引号字符串)
-
null(唯一合法的空值表示)
像 undefined、函数、Date对象、RegExp、Symbol、Map、Set、Promise 等,都不属于JSON原生类型,直接序列化会出错或被忽略(如JSON.stringify({x: undefined}) 得到 {})。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
检查嵌套结构是否合法
即使顶层是对象或数组,也要确保内部没有非法嵌套:
- 对象中不能有重复键名(虽不报错,但后出现的会覆盖前一个)
- 数组或对象不能包含自身(循环引用),否则
JSON.stringify抛TypeError - 键名不能是数字或布尔字面量(如
{123: "a"}会被自动转为{"123": "a"},但{true: "b"}中true会被转成"true"—— 这容易引发逻辑歧义)
验证序列化行为是否可控
某些语言/框架允许自定义序列化逻辑(如Java的@JsonInclude、Go的json: tag、Python的default参数),但判断“是否符合要求”应以**默认行为**为准:
- 在JavaScript中,可尝试
JSON.stringify(value)不抛错,且结果是有效JSON字符串(再用JSON.parse()反向验证) - 在C++(如QClaw),需确认结构体成员均为public、类型受支持,并已正确声明
QCLAW_JSON_SERIALIZABLE宏 - 在Go中,字段名必须首字母大写(可导出),或显式用
json:"name"tag 映射小写字段 - 在.NET中,类需标记
[DataContract],字段需[DataMember],且类型在支持列表内
快速实操建议
最简验证方式(以JS为例):
(仅作参考,生产环境建议配合Schema校验)- 用
typeof value === 'object' && value !== null排除非对象/数组的简单值 - 对对象/数组执行
JSON.stringify(value),捕获异常 - 再用
JSON.parse()尝试解析结果,确认可逆 - 若含日期、二进制等特殊数据,先手动转为ISO字符串或Base64,再判断

















