Al usar SQL Server, puede usar FOR JSON
cláusula en una consulta para formatear los resultados como JSON. Al hacer esto, debe elegir AUTO
o la PATH
opción. Este artículo contiene ejemplos del uso de PATH
opción.
Sintaxis
La sintaxis es así:
SELECT ... (your query goes here) FOR JSON PATH;
Básicamente, todo lo que necesita hacer es agregar FOR JSON PATH
hasta el final de su consulta.
Ejemplo 1:uso básico
Aquí hay un ejemplo para demostrarlo.
USE Music; SELECT TOP 3 AlbumName, ReleaseDate FROM Albums FOR JSON PATH;
Resultado:
[ { "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }, { "AlbumName": "Powerage", "ReleaseDate": "1978-05-05" }, { "AlbumName": "Singing Down the Lane", "ReleaseDate": "1956-01-01" } ]
Entonces, los resultados aparecen como un documento JSON bien formateado, en lugar de filas y columnas.
En este caso utilicé TOP 3
para limitar el conjunto de resultados a solo tres resultados.
¿Resultados de una sola línea?
Sus resultados pueden aparecer inicialmente en una sola fila y una sola columna, y como una línea larga como esta:
Si este es el caso, intente hacer clic en el conjunto de resultados. Dependiendo de su software de administración de base de datos, esto debería iniciar el documento JSON como aparece en el ejemplo anterior.
Que esto funcione exactamente como se describe dependerá del software que utilice para consultar SQL Server.
En el momento de escribir este artículo, esto funcionaba bien para mí cuando usaba SQL Operations Studio (que desde entonces ha cambiado de nombre a Azure Data Studio). También funcionó bien al usar la extensión MSSQL en VS Code. Sin embargo, SSMS solo formatea los resultados como una línea larga (aunque aún en formato JSON).
También tuve diversos grados de éxito con las herramientas de línea de comandos.
También puede encontrar que los resultados se distribuyen inicialmente en varias filas, según el tamaño del conjunto de resultados.
Si no puede hacer que muestre los resultados de manera satisfactoria, pruebe con una herramienta diferente.
Ejemplo 2:consulta en varias tablas
En este ejemplo, consulto dos tablas que tienen una relación de uno a muchos entre ellas. En este caso, cada artista puede tener muchos álbumes y utilizo una subconsulta para recuperar los álbumes de cada artista.
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;
Resultado:
[ { "ArtistName": "AC/DC", "Albums": [ { "AlbumName": "Powerage" } ] }, { "ArtistName": "Allan Holdsworth", "Albums": [ { "AlbumName": "All Night Wrong" }, { "AlbumName": "The Sixteen Men of Tain" } ] } ]
En este caso, cada álbum se ha anidado en "Álbumes". Esto se debe a que los álbumes se devuelven a través de una subconsulta.
Ejemplo 3:salida anidada con notación de puntos
Al usar el PATH
opción, puede usar nombres de columnas separados por puntos para crear objetos anidados.
Para hacer esto, use un alias separado por puntos. He aquí un ejemplo:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH;
Resultado:
[ { "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" } } ]
Ejemplo 4:agregar un nodo raíz
Puedes usar el ROOT()
opción para agregar un nodo raíz a la salida. Esto agrega un solo elemento de nivel superior a la salida. Para hacer esto, simplemente agregue el ROOT()
opción al final de la consulta, con el nombre que desea que tenga el nodo raíz.
Entonces podemos modificar el ejemplo anterior a este:
USE Music; SELECT TOP 3 AlbumId, AlbumName AS 'Details.Album Name', ReleaseDate AS 'Details.Release Date' FROM Albums FOR JSON PATH, ROOT('Albums');
Resultado:
{ "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" } } ] }
Ejemplo 5:quitar el envoltorio de matriz
Puede usar el WITHOUT_ARRAY_WRAPPER
opción para eliminar los corchetes que rodean los resultados.
Ejemplo:
USE Music; SELECT TOP 1 AlbumName, ReleaseDate FROM Albums FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
Resultado:
{ "AlbumName": "Powerslave", "ReleaseDate": "1984-09-03" }
Tenga en cuenta que si hace esto en un resultado de varias filas, terminará con un JSON no válido.