Wenn Sie SQL Server verwenden, können Sie den FOR JSON
verwenden -Klausel in einer Abfrage, um die Ergebnisse als JSON zu formatieren. Dabei müssen Sie entweder AUTO
auswählen oder der PATH
Möglichkeit. Dieser Artikel enthält Beispiele für die Verwendung von PATH
Option.
Syntax
Die Syntax lautet wie folgt:
SELECT ... (your query goes here) FOR JSON PATH;
Im Grunde müssen Sie also nur FOR JSON PATH
hinzufügen bis zum Ende Ihrer Anfrage.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel zur Veranschaulichung.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON PATH;
Ergebnis:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Die Ergebnisse werden also als schön formatiertes JSON-Dokument ausgegeben, anstatt in Zeilen und Spalten.
In diesem Fall habe ich TOP 3
verwendet um die Ergebnismenge auf nur drei Ergebnisse zu beschränken.
Einzeilige Ergebnisse?
Ihre Ergebnisse können anfänglich in einer einzelnen Zeile und einer einzelnen Spalte und als eine lange Linie wie diese angezeigt werden:
Versuchen Sie in diesem Fall, auf die Ergebnismenge zu klicken. Abhängig von Ihrer Datenbankverwaltungssoftware sollte dies das JSON-Dokument starten, wie es im obigen Beispiel angezeigt wird.
Ob dies genau wie beschrieben funktioniert, hängt von der Software ab, die Sie zum Abfragen von SQL Server verwenden.
Zum Zeitpunkt des Verfassens dieses Artikels funktionierte dies bei Verwendung von SQL Operations Studio (das inzwischen in Azure Data Studio umbenannt wurde) einwandfrei. Es funktionierte auch gut, wenn die MSSQL-Erweiterung in VS Code verwendet wurde. SSMS formatiert die Ergebnisse jedoch nur als eine lange Zeile (allerdings immer noch im JSON-Format).
Ich hatte auch unterschiedlichen Erfolg mit Befehlszeilen-Tools.
Möglicherweise stellen Sie auch fest, dass die Ergebnisse zunächst auf mehrere Zeilen verteilt sind, je nachdem, wie groß die Ergebnismenge ist.
Wenn Sie die Ergebnisse nicht zufriedenstellend anzeigen können, versuchen Sie es mit einem anderen Tool.
Beispiel 2 – Abfrage über mehrere Tabellen hinweg
In diesem Beispiel frage ich zwei Tabellen ab, zwischen denen eine 1:n-Beziehung besteht. In diesem Fall kann jeder Künstler viele Alben haben, und ich verwende eine Unterabfrage, um die Alben für jeden Künstler abzurufen.
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;
Ergebnis:
[ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ]
In diesem Fall wurde jedes Album unter „Alben“ verschachtelt. Dies liegt daran, dass die Alben über eine Unterabfrage zurückgegeben werden.
Beispiel 3 – Verschachtelte Ausgabe mit Punktnotation
Bei Verwendung des PATH
Option können Sie durch Punkte getrennte Spaltennamen verwenden, um verschachtelte Objekte zu erstellen.
Verwenden Sie dazu einen durch Punkte getrennten Alias. Hier ist ein Beispiel:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Ergebnis:
[ { "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" } } ]
Beispiel 4 – Wurzelknoten hinzufügen
Sie können den ROOT()
verwenden Option zum Hinzufügen eines Stammknotens zur Ausgabe. Dadurch wird der Ausgabe ein einzelnes Element der obersten Ebene hinzugefügt. Fügen Sie dazu einfach den ROOT()
hinzu Option am Ende der Abfrage, mit dem Namen, den der Stammknoten haben soll.
Wir können also das vorherige Beispiel wie folgt ändern:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH, ROOT('Albums');
Ergebnis:
{ "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" } } ] }
Beispiel 5 – Entfernen Sie den Array-Wrapper
Sie können den WITHOUT_ARRAY_WRAPPER
verwenden Option zum Entfernen der eckigen Klammern, die die Ergebnisse umgeben.
Beispiel:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
Ergebnis:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Beachten Sie, dass Sie, wenn Sie dies für ein Ergebnis mit mehreren Zeilen tun, am Ende ein ungültiges JSON erhalten.