JSON naar tabellen
Deze pagina hoort bij de REST API-koppeling en legt uit wat er met de JSON-respons van een API gebeurt: hoe Yres die omzet naar rijen en kolommen, wat er ondersteund wordt, en hoe je dat kunt bijsturen.
In het kort
- Yres laat ADF niet kolom-voor-kolom mappen. De volledige respons wordt als één stuk tekst
opgehaald en server-side in SQL Server ontleed met
OPENJSON. Dit is schema-on-read: de tabelstructuur volgt uit de JSON die binnenkomt, niet uit een vooraf vastgelegd schema. - Je hoeft geen veldmapping te maken. Yres maakt en breidt de STAGE-tabel automatisch uit op basis van de velden in de respons.
- De enige knop die je meestal nodig hebt is de collection: het pad naar de lijst met records in de
respons. Standaard staat die op
AUTOen raadt Yres het pad zelf.
De verwerking, stap voor stap
- De Copy-activity in de dynamische REST-pipeline haalt de JSON op en schrijft de hele
response-body ongewijzigd weg als tekst (de translator mapt
$→ één kolomJson,mapComplexValuesToString). ADF interpreteert de structuur dus niet zelf. - De sink roept de stored procedure
LoadManagement.spFillTable_Jsonaan met drie dingen: de ruwe JSON, de collection en de doeltabel (STAGE-schema + tabelnaam). spFillTable_Jsondoet twee dingen om de JSON robuust te maken:- Array-reparatie. Levert de API een kale array zonder omhulsel (iets wat ADF soms opbreekt),
dan wordt die opnieuw als
[ … ]ingepakt zodat hij geldig blijft. - Collection-normalisatie. Staat de collection niet op
AUTOen begint hij niet met$, dan wordt er$.voorgezet (datawordt dus$.data).
- Array-reparatie. Levert de API een kale array zonder omhulsel (iets wat ADF soms opbreekt),
dan wordt die opnieuw als
- Vervolgens ontleedt
spJsonToTablede records metOPENJSON, leidt per veld het datatype af, en genereert dynamisch eenSELECT … FROM OPENJSON(…) WITH (…)die een platte tabel oplevert.- Bestaat de doeltabel nog niet, dan wordt die aangemaakt (met
SELECT … INTO). - Bestaat hij al, dan worden ontbrekende kolommen toegevoegd (
ALTER TABLE … ADD) en de rijen ingevoegd. Kolommen worden nooit verwijderd.
- Bestaat de doeltabel nog niet, dan wordt die aangemaakt (met
De platte STAGE-tabel gaat daarna de gewone laadmotor in (STAGE → HIS/SCD2), net als bij elke andere bron. Zie De laadmotor.
De collection: het pad naar je records
De collection is een JSON-pad naar de array met records in de respons. Het is een instelling
per tabel (in het "Tabel toevoegen"-scherm van een REST-bron staat het veld collection, standaard
AUTO).
AUTO (standaard)
Bij AUTO zoekt Yres zelf de meest waarschijnlijke records-array met de functie
fxGetJsonCollections. Die kijkt of ergens in de respons (tot 10 niveaus diep) een array van objecten
staat en rangschikt kandidaten op de naam van het omhulsel. Veelvoorkomende namen krijgen voorrang,
in deze volgorde:
result→results→data→value→values→records→entries→rows→list→elements→objects→nodes→children→resources→entities→events→logs/messages→entity→documents
Staan er meerdere kandidaten, dan wint de bekendste naam; bij gelijke stand het ondiepste pad. Is de
root zelf een array ([ { … }, { … } ]), dan wordt de collection $.
Zelf een pad opgeven
Raadt AUTO verkeerd — bijvoorbeeld omdat de API een ongebruikelijke wrappernaam of meerdere arrays
gebruikt — dan vul je het pad handmatig in. Dat mag als:
- een kale naam:
data - een genest pad met punten:
result.items - een volledig JSONPath:
$.data.records
Wat Yres met de waarden doet
Datatypes
Yres leidt per kolom een SQL-datatype af uit de JSON-waarden:
| JSON-waarde | Kolomtype in de tabel |
|---|---|
tekst ("…") | NVARCHAR(MAX) |
| geheel getal | INT |
| kommagetal / wetenschappelijke notatie | DECIMAL(38,15) |
true / false | BIT |
genest object { … } | platgeslagen naar puntkolommen (zie hieronder) |
array [ … ] | bewaard als JSON-tekst in één kolom (NVARCHAR(MAX)) |
null | geen eigen type; valt onder de rest |
Een paar aandachtspunten:
- Alleen echte JSON-getallen worden numeriek. Een getal tussen aanhalingstekens (
"123") is voor JSON een string en blijft dus tekst. - Yres kiest één type per kolom op basis van alle waarden in de respons. Bevat hetzelfde veld sterk wisselende typen (nu eens een getal, dan weer tekst), dan kan dat tot conversiefouten leiden. Leg het type in dat geval vast (zie Sturen op het resultaat).