Когато използвате SQL сървър, можете да използвате FOR JSON клауза в заявка за форматиране на резултатите като JSON. Когато правите това, трябва да изберете или AUTO или PATH опция. Тази статия съдържа примери за използване на PATH опция.
Синтаксис
Синтаксисът е така:
SELECT ... (your query goes here) FOR JSON PATH;
Така че по принцип всичко, което трябва да направите, е да добавите FOR JSON PATH до края на вашата заявка.
Пример 1 – Основна употреба
Ето пример за демонстрация.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON PATH;
Резултат:
[
{
"AlbumName": "Powerslave",
"ReleaseDate": "1984-09-03"
},
{
"AlbumName": "Powerage",
"ReleaseDate": "1978-05-05"
},
{
"AlbumName": "Singing Down the Lane",
"ReleaseDate": "1956-01-01"
}
]
Така резултатите излизат като добре форматиран JSON документ, вместо в редове и колони.
В този случай използвах TOP 3 за да ограничите набора от резултати до само три резултата.
Резултати от един ред?
Резултатите ви може първоначално да се показват в един ред и една колона и като един дълъг ред като този:

Ако случаят е такъв, опитайте да щракнете върху набора от резултати. В зависимост от вашия софтуер за управление на база данни, това трябва да стартира JSON документа, както е показано в горния пример.
Дали това работи точно както е описано ще зависи от софтуера, който използвате за запитване на SQL Server.
Към момента на писане това работи добре за мен, когато използвах SQL Operations Studio (което оттогава е преименувано на Azure Data Studio). Също така работи добре при използване на разширението MSSQL в VS Code. SSMS обаче форматира резултатите само като един дълъг ред (въпреки че все още във формат JSON).
Освен това имах различна степен на успех с помощта на инструменти на командния ред.
Може също така да откриете, че резултатите първоначално са разпределени в няколко реда в зависимост от това колко голям е наборът от резултати.
Ако не можете да го накарате да показва резултатите по задоволителен начин, опитайте друг инструмент.
Пример 2 – Заявка в множество таблици
В този пример правя заявка за две таблици, които имат връзка едно към много между тях. В този случай всеки изпълнител може да има много албуми и аз използвам подзаявка, за да извличам албумите за всеки изпълнител.
USE Music;
SELECT TOP 2 ArtistName,
(SELECT AlbumName
FROM Albums
WHERE Artists.ArtistId = Albums.ArtistId
FOR JSON PATH) AS Albums
FROM Artists
ORDER BY ArtistName
FOR JSON PATH;
Резултат:
[
{
"ArtistName": "AC/DC",
"Albums": [
{
"AlbumName": "Powerage"
}
]
},
{
"ArtistName": "Allan Holdsworth",
"Albums": [
{
"AlbumName": "All Night Wrong"
},
{
"AlbumName": "The Sixteen Men of Tain"
}
]
}
]
В този случай всеки албум е вложен под „Албуми“. Това е така, защото албумите се връщат чрез подзаявка.
Пример 3 – Вложен изход с точка нотация
Когато използвате PATH опция, можете да използвате разделени с точки имена на колони, за да създадете вложени обекти.
За да направите това, използвайте псевдоним, разделен с точки. Ето един пример:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Резултат:
[
{
"AlbumId": 1,
"Details": {
"Album Name": "Powerslave",
"Release Date": "1984-09-03"
}
},
{
"AlbumId": 2,
"Details": {
"Album Name": "Powerage",
"Release Date": "1978-05-05"
}
},
{
"AlbumId": 3,
"Details": {
"Album Name": "Singing Down the Lane",
"Release Date": "1956-01-01"
}
}
]
Пример 4 – Добавяне на коренен възел
Можете да използвате ROOT() опция за добавяне на главен възел към изхода. Това добавя един единствен елемент от най-високо ниво към изхода. За да направите това, просто добавете ROOT() опция до края на заявката с името, което искате да има основният възел.
Така че можем да модифицираме предишния пример към това:
USE Music;
SELECT TOP 3
AlbumId,
AlbumName AS 'Details.Album Name',
ReleaseDate AS 'Details.Release Date'
FROM Albums
FOR JSON PATH, ROOT('Albums');
Резултат:
{
"Albums": [
{
"AlbumId": 1,
"Details": {
"Album Name": "Powerslave",
"Release Date": "1984-09-03"
}
},
{
"AlbumId": 2,
"Details": {
"Album Name": "Powerage",
"Release Date": "1978-05-05"
}
},
{
"AlbumId": 3,
"Details": {
"Album Name": "Singing Down the Lane",
"Release Date": "1956-01-01"
}
}
]
}
Пример 5 – Премахване на обвивката на масива
Можете да използвате WITHOUT_ARRAY_WRAPPER опция за премахване на квадратните скоби, които обграждат резултатите.
Пример:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
Резултат:
{
"AlbumName": "Powerslave",
"ReleaseDate": "1984-09-03"
}
Имайте предвид, че ако направите това с резултат от няколко реда, ще получите невалиден JSON.