怎么用SQL的ISJSON函数在写入前验证数据是否符合JSON规范?

轻磊同学_4047

轻磊同学_4047

2026-10-26

947人浏览

原创

能,ISJSON函数在SQL Server 2016+中可直接校验字符串是否为合法JSON,仅检查基础语法(括号、引号、值类型等),返回1表示合法,0或NULL表示不合法,不校验语义或业务规则。

怎么用sql的isjson函数在写入前验证数据是否符合json规范?

ISJSON 函数能直接判断字符串是否合法 JSON 吗?

能,但仅限于 SQL Server 2016 及以上版本。它不解析结构语义(比如字段名重复、数字溢出),只做基础语法校验:括号配对、引号闭合、键名是否带引号、值类型是否符合 JSON 标准(null、true、false、字符串、数字、数组、对象)。返回 1 表示通过,0 或 NULL 表示不合法。

INSERT 前用 ISJSON 防止非法 JSON 写入的写法

别在应用层做校验再发 SQL —— 网络传输或并发下仍有风险。直接在 SQL 层拦截最可靠。常见写法是把 ISJSON() 放进 CHECK 约束或 INSERT ... SELECT 的 WHERE 条件里:

INSERT INTO logs (id, payload)
SELECT @id, @payload
WHERE ISJSON(@payload) = 1;

如果想让失败更明确,可配合 THROW:

Json Repair Kit
Json Repair Kit

使用 Node.js 评估修复格式错误的 JSON,自动纠正尾随逗号、单引号、未加引号的键等常见问题,实现文件规范化。

下载
IF ISJSON(@payload)  1
    THROW 50000, 'payload is not valid JSON', 1;
INSERT INTO logs (id, payload) VALUES (@id, @payload);
  • @payload 必须是 NVARCHAR(MAX) 类型,否则 ISJSON 返回 NULL(不是 0)导致条件失效
  • 空字符串 ''、纯空白(如 ' ')、NULL 均返回 0,符合预期
  • 注意单引号转义:传入的 JSON 字符串本身含单引号时,SQL Server 不会自动转义,需在应用层处理或用 REPLACE 预清洗

ISJSON 和 JSON_VALUE/JSON_QUERY 联用时的坑

ISJSON 通过 ≠ 数据能被 JSON_VALUE 正确提取。例如:{"a": 1, "a": 2} 是语法合法 JSON(某些解析器接受),ISJSON 返回 1,但 JSON_VALUE 只取最后一个 "a";又如 {"x": 999999999999999999999} 超出 float 精度,ISJSON 仍返回 1,但后续解析可能失真。

  • 若业务依赖字段存在性或数值精度,不能只靠 ISJSON,得加 TRY_CAST(... AS bigint) 或正则预筛数字范围
  • JSON_QUERY 对非对象/数组返回 NULL,但 ISJSON 仍为 1,所以想确保是对象得写 ISJSON(@json) = 1 AND JSON_QUERY(@json, '$') IS NOT NULL
  • SQL Server 不校验 Unicode 代理对(surrogate pair),"\uD83D\uDE00"(?)能过 ISJSON,但某些客户端解析异常

替代方案:什么时候不该用 ISJSON?

MySQL 和 PostgreSQL 没有原生 ISJSON。MySQL 8.0+ 用 JSON_VALID(),PostgreSQL 则需自定义函数或靠 jsonb 类型强制校验(插入时自动拒绝非法 JSON)。如果数据库不支持,或者字段要频繁做路径查询,直接用 JSON / JSONB 类型比 NVARCHAR + ISJSON 更省心——类型本身就会拦截非法输入,无需额外判断。

ISJSON 是轻量兜底,不是万能解析器。真正关键的字段结构约束,得靠应用层 Schema 校验或数据库 CHECK 表达式组合实现。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json json处理 json数组

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2175

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3402

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1136

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3919

7

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5891

4

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

60

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

40

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

40

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

20

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习