Ricerca…


Ottieni chiave: coppie di valori dal testo JSON

La funzione OPENJSON analizza il testo JSON e restituisce tutte le chiavi: coppie di valori al primo livello di JSON:

declare @json NVARCHAR(4000) = N'{"Name":"Joe","age":27,"skills":["C#","SQL"]}';
SELECT * FROM OPENJSON(@json);
chiave valore genere
Nome Joe 1
età 27 2
abilità [ "C #", "SQL"] 4

Il tipo di colonna descrive il tipo di valore, ad esempio null (0), string (1), number (2), boolean (3), array (4) e object (5).

Trasforma l'array JSON in un insieme di righe

La funzione OPENJSON analizza la raccolta di oggetti JSON e restituisce valori dal testo JSON come set di righe.

declare @json nvarchar(4000) = N'[
  {"Number":"SO43659","Date":"2011-05-31T00:00:00","Customer": "MSFT","Price":59.99,"Quantity":1},
  {"Number":"SO43661","Date":"2011-06-01T00:00:00","Customer":"Nokia","Price":24.99,"Quantity":3}
]'

SELECT    * 
FROM OPENJSON (@json)
    WITH (
          Number   varchar(200),
          Date     datetime,
          Customer varchar(200),
          Quantity int
  )

Nella clausola WITH viene specificato lo schema di restituzione della funzione OPENJSON. Le chiavi negli oggetti JSON sono recuperate per nome di colonna. Se alcune chiavi in ​​JSON non sono specificate nella clausola WITH (ad es. Price in questo esempio) verranno ignorate. I valori vengono automaticamente convertiti in tipi specificati.

Numero Data Cliente Quantità
SO43659 2011-05-31T00: 00: 00 MSFT 1
SO43661 2011-06-01T00: 00: 00 Nokia 3

Trasforma i campi JSON nidificati in un insieme di righe

La funzione OPENJSON analizza la raccolta di oggetti JSON e restituisce valori dal testo JSON come set di righe. Se i valori nell'oggetto di input sono nidificati, è possibile specificare un parametro di mapping aggiuntivo in ogni colonna nella clausola WITH:

declare @json nvarchar(4000) = N'[
  {"data":{"num":"SO43659","date":"2011-05-31T00:00:00"},"info":{"customer":"MSFT","Price":59.99,"qty":1}},
  {"data":{"number":"SO43661","date":"2011-06-01T00:00:00"},"info":{"customer":"Nokia","Price":24.99,"qty":3}}
]'

SELECT    * 
FROM OPENJSON (@json)
    WITH (
          Number   varchar(200) '$.data.num',
          Date     datetime '$.data.date',
          Customer varchar(200) '$.info.customer',
          Quantity int '$.info.qty',
  )

Nella clausola WITH viene specificato lo schema di restituzione della funzione OPENJSON. Dopo il tipo viene specificato il percorso dei nodi JSON in cui deve essere trovato il valore restituito. Le chiavi negli oggetti JSON vengono recuperate da questi percorsi. I valori vengono automaticamente convertiti in tipi specificati.

Numero Data Cliente Quantità
SO43659 2011-05-31T00: 00: 00 MSFT 1
SO43661 2011-06-01T00: 00: 00 Nokia 3

Estrazione di oggetti secondari JSON interni

OPENJSON può estrarre frammenti di oggetti JSON all'interno del testo JSON. Nella definizione della colonna che fa riferimento all'oggetto secondario JSON, impostare il tipo nvarchar (max) e l'opzione AS JSON:

declare @json nvarchar(4000) = N'[
  {"Number":"SO43659","Date":"2011-05-31T00:00:00","info":{"customer":"MSFT","Price":59.99,"qty":1}},
  {"Number":"SO43661","Date":"2011-06-01T00:00:00","info":{"customer":"Nokia","Price":24.99,"qty":3}}
]'

SELECT    * 
FROM OPENJSON (@json)
    WITH (
          Number   varchar(200),
          Date     datetime,
          Info nvarchar(max) '$.info' AS JSON
  )

La colonna Info verrà mappata sull'oggetto "Info". I risultati saranno:

Numero Data Informazioni
SO43659 2011-05-31T00: 00: 00 { "Cliente": "MSFT", "Prezzo": 59,99, "qty": 1}
SO43661 2011-06-01T00: 00: 00 { "Cliente": "Nokia", "Prezzo": 24.99, "qty": 3}

Lavorare con i sotto-array JSON nidificati

JSON può avere una struttura complessa con array interni. In questo esempio, abbiamo una matrice di ordini con sub array nidificato di OrderItems.

declare @json nvarchar(4000) = N'[
  {"Number":"SO43659","Date":"2011-05-31T00:00:00",
    "Items":[{"Price":11.99,"Quantity":1},{"Price":12.99,"Quantity":5}]},
  {"Number":"SO43661","Date":"2011-06-01T00:00:00",
    "Items":[{"Price":21.99,"Quantity":3},{"Price":22.99,"Quantity":2},{"Price":23.99,"Quantity":2}]}
]'

Possiamo analizzare le proprietà del livello root usando OPENJSON che restituirà il frammento AS JSON dell'array Items. Quindi possiamo applicare nuovamente OPENJSON sull'array Items e aprire la tabella JSON interna. La tabella del primo livello e la tabella interna saranno "uniti" come nel JOIN tra le tabelle standard:

SELECT    * 
FROM
    OPENJSON (@json)
    WITH (  Number varchar(200), Date datetime,
            Items nvarchar(max) AS JSON )
        CROSS APPLY 
            OPENJSON (Items)
            WITH ( Price float, Quantity int)

risultati:

Numero Data Elementi Prezzo Quantità
SO43659 2011-05-31 00: 00: 00.000 [{ "Prezzo": 11.99, "Quantità": 1}, { "Prezzo": 12.99, "Quantità": 5}] 11.99 1
SO43659 2011-05-31 00: 00: 00.000 [{ "Prezzo": 11.99, "Quantità": 1}, { "Prezzo": 12.99, "Quantità": 5}] 12.99 5
SO43661 2011-06-01 00: 00: 00.000 [{ "Prezzo": 21.99, "Quantità": 3}, { "Prezzo": 22.99, "Quantità": 2}, { "Prezzo": 23.99, "Quantità": 2}] 21.99 3
SO43661 2011-06-01 00: 00: 00.000 [{ "Prezzo": 21.99, "Quantità": 3}, { "Prezzo": 22.99, "Quantità": 2}, { "Prezzo": 23.99, "Quantità": 2}] 22.99 2
SO43661 2011-06-01 00: 00: 00.000 [{ "Prezzo": 21.99, "Quantità": 3}, { "Prezzo": 22.99, "Quantità": 2}, { "Prezzo": 23.99, "Quantità": 2}] 23.99 2


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow