我的情况下有一个小问题因为在我的情况下,一列可以直接包含文本'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\"]"}]
然后它在输出中提供转义字符。代码有什么问题?
AFAIK,如果没有一些难看的文本操作,您将无法实现这一目标
with t(result) as (select NameList from jsonTest for json auto)
select replace(replace(replace(result,'"[','['),']"',']'),'\"','')
from t
-
+-----------------------------+
| [{"NameList":[John,Smith]}] |
+-----------------------------+