You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OPENJSON解析JSON字符串报错,但JSON经校验合法

解决SQL Server OPENJSON报Msg 13609(JSON格式错误)的问题

常见原因及修复方案

  • 变量类型与字符串转义问题
    确保@json是NVARCHAR(MAX)类型(而非VARCHAR),避免编码差异导致的非法字符识别错误。如果用单引号包裹JSON字符串赋值,内部的单引号需转义为两个单引号,双引号直接保留即可。示例:

    DECLARE @json NVARCHAR(MAX) = '{"created": "2024-01-01", "desc": "It''s valid"}';
    
  • 不可见控制字符干扰
    错误提示位置13存在意外字符,大概率是JSON中混入了不可见的Unicode控制字符(如换行、制表符、UTF-8 BOM)。用以下语句定位该字符的Unicode值:

    DECLARE @pos INT = 13;
    SELECT 
        SUBSTRING(@json, @pos, 1) AS TargetChar,
        UNICODE(SUBSTRING(@json, @pos, 1)) AS UnicodeCode;
    

    如果返回的UnicodeCode是65279(BOM)、9(制表符)、10(换行)或13(回车),执行以下语句清理:

    SET @json = TRIM(CHAR(0) + CHAR(9) + CHAR(10) + CHAR(13) + CHAR(65279) FROM @json);
    
  • SQL Server严格的JSON语法校验
    部分在通用校验工具中合法的语法,SQL Server不支持:

    • 禁止键名用单引号,必须用双引号(如{'created': '2024-01-01'}不合法)
    • 禁止对象/数组末尾加多余逗号(如{"created": "2024-01-01",}不合法)
    • 字符串内的双引号必须转义(如{"desc": "He said \"hello\""},SQL变量中需写为{"desc": "He said ""hello"""})

测试修复后的查询

清理完成后,用以下语句提取created字段:

-- 单个JSON对象
SELECT JSON_VALUE(@json, '$.created') AS created;

-- JSON数组
SELECT created
FROM OPENJSON(@json)
WITH (created DATE '$.created');

内容的提问来源于stack exchange,提问作者pythondumb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:45:46