Предотвратить двойное экранирование JSON в FOR JSON вывод в SQL - PullRequest
0 голосов
/ 17 марта 2020

У меня небольшая проблема в моем случае , потому что в моем случае столбец может содержать текст 'John' напрямую или текст как массив '["John", "Smith"] "оба. Так, как я могу предотвратить двойное экранирование JSON в FOR JSON output ? Я думаю, что я делаю что-то не так здесь. Пожалуйста, проверьте мой пример:

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

Теперь, если я хочу его вывод, он выдаст правильный вывод из этого (без escape-символа):

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\"]"}]

, затем это дает escape-символы на выходе . Что не так в коде?

1 Ответ

2 голосов
/ 17 марта 2020

Это поведение объясняется в документации - Если исходные данные содержат специальные символы, предложение FOR JSON экранирует их в выводе JSON с помощью '\' . Конечно, как вы уже знаете, когда JSON_QUERY () используется с FOR JSON AUTO , FOR JSON не экранирует специальные символы в возвращаемом значении JSON_QUERY .

Ваша проблема в том, что ваши данные не всегда JSON. Таким образом, одним из возможных подходов является создание оператора с повторяющимися именами столбцов (NameList). По умолчанию FOR JSON AUTO не включает в себя NULL значения в выводе, поэтому результатом является ожидаемое JSON. Просто отметьте, что вы не должны использовать INCLUDE_NULL_VALUES в выписке, или в окончательном JSON будут содержаться дубликаты ключей.

Таблица:

CREATE TABLE #jsonTest(NameList varchar(max))
insert into #jsonTest(NameList)
select '["John","Smith"]'
insert into #jsonTest(NameList)
Select 'John'

Выписка:

SELECT
   JSON_QUERY(CASE WHEN ISJSON(NameList) = 1 THEN JSON_QUERY(NameList) END) AS NameList,
   CASE WHEN ISJSON(NameList) = 0 THEN NameList END AS NameList
FROM #jsonTest 
FOR JSON AUTO

Результат:

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