Sök…


Hämta nyckel: värdepar från JSON-text

OPENJSON-funktionen analyserar JSON-text och returnerar alla nycklar: värdepar på den första nivån i JSON:

declare @json NVARCHAR(4000) = N'{"Name":"Joe","age":27,"skills":["C#","SQL"]}';
SELECT * FROM OPENJSON(@json);
nyckel värde typ
namn Joe 1
ålder 27 2
Kompetens [ "C #", "SQL"] 4

Kolumntyp beskriver värdetyp, dvs. noll (0), sträng (1), nummer (2), booleska (3), matris (4) och objekt (5).

Förvandla JSON-matris till uppsättning rader

OPENJSON-funktionen analyserar samling av JSON-objekt och returnerar värden från JSON-text som uppsättning rader.

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
  )

I MED-klausulen specificeras returschema för OPENJSON-funktionen. Nycklar i JSON-objekt hämtas med kolumnnamn. Om någon nyckel i JSON inte anges i MED-klausulen (t.ex. pris i detta exempel) ignoreras den. Värdena konverteras automatiskt till specificerade typer.

siffra Datum Kund Kvantitet
SO43659 2011-05-31T00: 00: 00 MSFT 1
SO43661 2011-06-01T00: 00: 00 Nokia 3

Förvandla kapslade JSON-fält till uppsättning rader

OPENJSON-funktionen analyserar samling av JSON-objekt och returnerar värden från JSON-text som uppsättning rader. Om värdena i ingångsobjektet är kapslade kan ytterligare mappningsparametrar anges i varje kolumn i MED-klausulen:

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',
  )

I MED-klausulen specificeras returschema för OPENJSON-funktionen. Efter att typen anges väg till JSON-noderna där det returnerade värdet ska hittas. Nycklar i JSON-objekt hämtas av dessa banor. Värdena konverteras automatiskt till specificerade typer.

siffra Datum Kund Kvantitet
SO43659 2011-05-31T00: 00: 00 MSFT 1
SO43661 2011-06-01T00: 00: 00 Nokia 3

Extrahera inre JSON-underobjekt

OPENJSON kan extrahera fragment av JSON-objekt i JSON-texten. I kolumndefinitionen som hänvisar till JSON-subobjektet anger du alternativet nvarchar (max) och 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
  )

Infokolumnen mappas till "Info" -objektet. Resultaten blir:

siffra Datum Info
SO43659 2011-05-31T00: 00: 00 { "Kund": "MSFT", "Price" 59,99 "st" 1}
SO43661 2011-06-01T00: 00: 00 { "Kund": "Nokia", "Price" 24,99 "st" 3}

Arbetar med kapslade JSON-undergrupper

JSON kan ha komplex struktur med inre matriser. I det här exemplet har vi en rad beställningar med kapslade underuppsättningar av 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}]}
]'

Vi kan analysera rotnivåegenskaper med hjälp av OPENJSON som kommer att returnera artiklar som AS JSON-fragment. Då kan vi tillämpa OPENJSON igen på artiklar array och öppna inre JSON tabell. Första nivån och det inre bordet kommer att "sammanfogas" som i JOIN mellan standardtabeller:

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

Resultat:

siffra Datum artiklar Pris Kvantitet
SO43659 2011-05-31 00: 00: 00.000 [{ "Pris": 11,99, "Mängd": 1}, { "Pris": 12,99, "Mängd": 5}] 11,99 1
SO43659 2011-05-31 00: 00: 00.000 [{ "Pris": 11,99, "Mängd": 1}, { "Pris": 12,99, "Mängd": 5}] 12,99 5
SO43661 2011-06-01 00: 00: 00.000 [{ "Pris": 21,99, "Mängd": 3}, { "Pris": 22,99, "Mängd": 2}, { "Pris": 23,99, "Mängd": 2}] 21,99 3
SO43661 2011-06-01 00: 00: 00.000 [{ "Pris": 21,99, "Mängd": 3}, { "Pris": 22,99, "Mängd": 2}, { "Pris": 23,99, "Mängd": 2}] 22,99 2
SO43661 2011-06-01 00: 00: 00.000 [{ "Pris": 21,99, "Mängd": 3}, { "Pris": 22,99, "Mängd": 2}, { "Pris": 23,99, "Mängd": 2}] 23,99 2


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow