Когато използвате 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.