JSON 文本格式不正确。在位置 0

问题描述 投票:0回答:3

我是 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')

“选择@v作为'v'”给了我

N'{"FirstName":"John","LastName":"Doe"}'

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

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

也能正常工作。

json sql-server-2016 sql-server-json
3个回答
17
投票

如果您使用的是 SQL Server 2016 或更高版本,则有内置函数

ISJSON
可验证列中的字符串是否为有效的 json。

因此你可以这样做:

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

7
投票

您正在

N
语句中添加
CONCAT
字符。

尝试更改线路:

set @v = CONCAT('N''',(SELECT value FROM OPENJSON(@json1, '$.name')),'''')

至:

set @v = CONCAT('''',(SELECT value FROM OPENJSON(@json1, '$.name')),'''')

3
投票
在应用

where 子句之前,首先对 all 行执行 JSON_VALUE 函数 may。这取决于执行计划,这意味着像 top x 子句或 order by 这样的小事情可能会对此产生影响。

  • 这意味着如果你的json数据在该列(整个表中)的任何地方无效,那么在执行查询时就会抛出错误。
  • 所以首先找到并修复那些无效的json格式。例如,如果该列在 Json 有效负载中具有 ' 而不是“”,则无法解析该列,并将导致整个 TSQL 查询抛出错误
  • 您可以使用 top 10order by id 来缩小结果集并找到导致 json 解析器中断的行
© www.soinside.com 2019 - 2024. All rights reserved.