在SQL的FOR JSON输出中防止双重转义的JSON

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

我的情况下有一个小问题因为在我的情况下,一列可以直接包含文本'John'或作为数组'[“ John”,“ Smith”]'的文本,所以我该如何防止双重转义的JSON在FOR JSON输出中。我想我在这里做错了。请检查我的示例:

Create table #jsonTest(NameList varchar(max))
insert into #jsonTest(NameList)
select '["John","Smith"]'

现在,如果我想要它的输出,它将从此给出正确的输出(没有转义符:

select JSON_QUERY(NameList) NameList from #jsonTest for json auto

输出:

[{"NameList":["John","Smith"]}]

简单文本示例:

truncate table #jsonTest
insert into #jsonTest(NameList)
Select 'John'

现在为此我必须更改我的选择查询以获取正确的输出,因为如上所述,JSON_QUERY只返回对象和数组。因此,我将其更改为以下形式:

select case when ISJSON(NameList) = 1 then JSON_QUERY(NameList) else NameList end NameList from #jsonTest for json auto

输出:

[{"NameList":"John"}]

现在它现在将提供正确的输出,但是如果我再次插入以前的数据并尝试上选择查询

truncate table #jsonTest
insert into #jsonTest(NameList)
select '["John","Smith"]'

select case when ISJSON(NameList) = 1 then JSON_QUERY(NameList) else NameList end NameList from #jsonTest for json auto

输出:

[{"NameList":"[\"John\",\"Smith\"]"}]

然后它在输出中提供转义字符。代码有什么问题?

sql json sql-server sql-server-2017
1个回答
0
投票

AFAIK,如果没有一些难看的文本操作,您将无法实现这一目标

with t(result) as (select NameList from jsonTest for json auto)
select replace(replace(replace(result,'"[','['),']"',']'),'\"','')
from   t

-

+-----------------------------+
| [{"NameList":[John,Smith]}] |
+-----------------------------+

SQL Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.