我有如下列中的 JSON 值。我尝试使用 OPENJSON 解析它。
DECLARE @json NVARCHAR(MAX)='[[108,290,1388,2056],[108,290,1388,2057]]'
DECLARE @json2 NVARCHAR(MAX)='{"1":29893,"2":1}'
DROP TABLE IF EXISTS #T1
SELECT @json AS [json] INTO #t1
INSERT INTO #t1 ([json]) SELECT @json2
SELECT * FROM #T1
CROSS APPLY OPENJSON([json])
WHERE ISJSON([json]) > 0
@json2 按预期返回,因为它具有键值对。但是 @json 需要另一个级别的解析,因为它没有键名称,我无法使用 JSON_VALUE 解析它。
再次执行 CROSS APPLY 会导致 @json2 出错,因为它现在不会成对(对于值 29893)。
SELECT * FROM #T1
CROSS APPLY OPENJSON(JSON) A
CROSS APPLY OPENJSON(value) B
WHERE ISJSON([JSON]) > 0
Msg 13609, Level 16, State 4, Line 66
JSON text is not properly formatted. Unexpected character '2' is found at position 0.
对于没有键名称的 JSON 对象,是否有一种更简单的方法,我不需要为不同的格式应用两个单独的逻辑?
您可以简单地过滤第二个中的值,将其应用到有效的 JSON 中:
(我还将您的 CROSS APPLY 更改为 OUTER APPLY。您可能需要在 WHERE 中进行一些过滤来纠正该问题。)