#c# #json #sql-server #datatables
#c# #json #sql-сервер #таблицы данных
Вопрос:
У меня есть запрос, отформатированный для возврата в формате JSON. Он возвращает массив объектов.
select id, name from [user]
for JSON auto
Вот массив объектов, которые он возвращает
[{
"id": "0FDF9BCA-1E41-4DA6-B892-0017DE395754",
"name": "I Accept Answers"
}, {
"id": "3E775870-D97A-4B23-B761-00382D932704",
"name": "Heywood Youhelpme"
},{
"id": "4E775870-D97A-4B23-B761-00382D932704",
"name": "Geeimiss Xml"
}
]
Однако имена объектов являются излишними в большом однородном наборе данных. Мне просто нужны данные (без имен объектов).
[
[
"0FDF9BCA-1E41-4DA6-B892-0017DE395754",
"I Accept Answers"
],
[
"3E775870-D97A-4B23-B761-00382D932704",
"Heywood Youhelpme"
],
[
"4E775870-D97A-4B23-B761-00382D932704",
"Geeimiss Xml"
]
]
Я надеюсь предоставить это как AJAX-ответ на стороне браузера DataTables.js дисплей.
Я видел несколько «действительно» грязных решений, которые действительно портят запрос, я надеюсь, что в инструкции «для JSON» есть какая-то опция «как массив» или аналогичная. Ничего такого, что требовало бы специальных инструкций для каждого параметра.
Комментарии:
1. Microsoft SQL Server 2017 (RTM-CU5) (KB4092643) — 14.0.3023.8 (X64) 2 марта 2018 18:24:44 Авторское право (C) 2017 Microsoft Corporation Web Edition (64-разрядная версия) на Windows Server 2016 Datacenter 10.0 <X64> (сборка 14393: ) (Гипервизор)
Ответ №1:
Итак, вы запрашиваете решение на javascript. Если это так, вы можете использовать Object.values
следующим образом :
var json = '[{"id": "0FDF9BCA-1E41-4DA6-B892-0017DE395754","name": "I Accept Answers"}, {"id": "3E775870-D97A-4B23-B761-00382D932704","name": "Heywood Youhelpme"},{"id": "4E775870-D97A-4B23-B761-00382D932704","name": "Geeimiss Xml"} ]';
var obj = JSON.parse(json);
var values = Object.keys(obj).map(function (key) { return Object.values(obj[key]); });
console.log(JSON.stringify(values));
ЕСЛИ вам нужно решение SQL Server 2017, FOR JSON
всегда будет возвращать объекты JSON, поэтому, чтобы иметь массивы, вам нужно будет создать его вручную :
SELECT RESULT = '[' STRING_AGG( ISNULL('[ "' id '","' Name '" ]', ''), ',') ']'
FROM
[user]
Комментарии:
1. Извините, нет. Я ищу решение SQL. Я пытаюсь получить только те данные, которые я хочу, в браузере, а не исправлять их в браузере.
2. @WilliamWalseth Я обновил свой ответ с помощью SQL solution.
3. Спасибо iSR5, но откуда берется @JSON? Я начинаю с SQL-запроса и хочу создать JSON с помощью этого массива массивов. SQL уже создает массивы объектов, которые вы тоже создаете. У меня есть десятки существующих запросов, которые нужно изменить, поэтому я не могу перестроить их все с помощью этой манипуляции со строками.
4. @WilliamWalseth
@JSON
— это ваши текущие результаты json (которые уже преобразованы из таблицы с использованиемselect id, name from [user] for JSON auto
, и результат приведенного выше запроса вернет массивы значений объектов (в данном случае я возвращаю толькоname
значения в виде массива).).5. @WilliamWalseth Извините, я снова обновил свой ответ, на этот раз я удалил предыдущее решение, поскольку вам не нужно использовать
FOR JSON
, поскольку вы хотите возвращать массивы массивов, в то время как SQL Server будет возвращать только объекты. Таким образом, прямой выбор с помощьюSTRING_AGG
сделал бы свое дело.
Ответ №2:
вы можете попробовать запрос, подобный приведенному ниже, который использует функции QUOTENAME И STRING_AGG tsql в тандеме
select
'['
STRING_AGG(CAST(QUOTENAME(QUOTENAME(id,'"') ',' QUOTENAME(name,'"')) AS NVARCHAR(MAX)),',')
']'
from [user]
и это тоже сработает
select '['
STRING_AGG(CAST(CONCAT('["', id ,'","' , name,'"]') AS NVARCHAR(MAX)),',')
']' from [user]
Возможно, вы захотите попробовать это, если вам нужна оболочка для вывода JSON
SELECT REPLACE(REPLACE(REPLACE((select id, name from [user]
for JSON auto),'[{','[['),'}]',']]'),'},{','],[')
Комментарии:
1. Спасибо, но я действительно пытаюсь избежать такого рода беспорядочного решения, которое требует изменения всего запроса.
2. @WilliamWalseth вам понадобится приведение. Обновление запроса 1
3. Dhruv, спасибо, что ты настоящий эксперт в обработке строк, чтобы так быстро придумать это, но это действительно не то направление, на которое я надеюсь. Поддерживает ли MSSQL это изначально с помощью какой-либо опции?
4. @WilliamWalseth, о котором я не знаю.