JSON 文本格式不正确。在位置 0 处发现意外字符“N”

use*_*272 11 json sql-server-2016 sql-server-json

我是 SQL 中 JSON 的新手。我收到错误“JSON 文本格式不正确。在位置 0 处发现意外字符“N”。” 执行以下操作时 -

DECLARE @json1 NVARCHAR(4000)
set @json1 = N'{"name":[{"FirstName":"John","LastName":"Doe"}], "age":31, "city":"New York"}'
DECLARE @v NVARCHAR(4000)
set @v = CONCAT('N''',(SELECT value FROM OPENJSON(@json1, '$.name')),'''')
--select @v as 'v'
SELECT  JSON_VALUE(@v,'$.FirstName')
Run Code Online (Sandbox Code Playgroud)

“ select @v as 'v' ”给了我

N'{"FirstName":"John","LastName":"Doe"}'
Run Code Online (Sandbox Code Playgroud)

但是,在最后一个 select 语句中使用它会给我错误。

DECLARE @v1 NVARCHAR(4000)
set @v1 = N'{"FirstName":"John","LastName":"Doe"}'
SELECT  JSON_VALUE(@v1,'$.FirstName') as 'FirstName'
Run Code Online (Sandbox Code Playgroud)

也工作正常。

osy*_*ets 17

如果您使用的是 SQL Server 2016 或更高版本,则有内置函数ISJSON可验证列中的字符串是否为有效的 json。

因此你可以这样做:

SELECT 
  Name,
  JSON_VALUE(jsonCol, '$.info.address.PostCode') AS PostCode
FROM People
WHERE ISJSON(jsonCol) > 0
Run Code Online (Sandbox Code Playgroud)


小智 7

N您正在声明中添加该字符CONCAT

尝试改变线路:

set @v = CONCAT('N''',(SELECT value FROM OPENJSON(@json1, '$.name')),'''')
Run Code Online (Sandbox Code Playgroud)

到:

set @v = CONCAT('''',(SELECT value FROM OPENJSON(@json1, '$.name')),'''')
Run Code Online (Sandbox Code Playgroud)