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

js4nwp54  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(176)

我是新的JSON在SQL.我得到错误“JSON文本格式不正确.意外字符'N'是发现在位置0.”而执行下面-

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'


也可以正常工作。

w8biq8rn

w8biq8rn1#

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

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

字符串

ru9i0ody

ru9i0ody2#

CONCAT语句中添加N字符。
试着换一条线:

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

字符串
收件人:

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

7vhp5slm

7vhp5slm3#

在应用where子句之前,JSON_VALUE函数可能会首先在所有行上执行。这将取决于执行计划,这意味着像top x子句或order by这样的小事情可能会对它产生影响。

  • 这意味着,如果你的json数据在该列(整个表)的任何地方都是无效的,它将在执行查询时抛出错误。
  • 因此,首先找到并修复那些无效的json格式。例如,如果该列在Json有效负载中有**'而不是“**”,则无法解析它,并将导致整个TSQL查询抛出错误。
  • 你可以使用top 10order byid来缩小结果集,并找到导致json解析器中断的行

相关问题