Выберите для JSON возвращаемый массив строковых массивов (не массив объектов)

#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, о котором я не знаю.