Werken met de JSON-functies
FileMaker Pro heeft verschillende tekstfuncties waarmee uw app op maat JSON-gegevens uit andere bronnen kan parseren en wijzigen, zoals webservices die gegevens in JSON-structuur via een REST API overbrengen.
Raadpleeg json.org voor meer informatie over de JSON-gegevensstructuur.
JSON-gegevens opmaken
JSON-gegevens vereisen geen spaties of regeleinden tussen elementen. Om de gegevens toch beter te kunnen lezen wanneer u problemen oplost, gebruikt u de JSONFormatElements functie die tabs en regeleinden toevoegt, zoals u in Voorbeeld van JSON-gegevens kunt zien.
JSON-gegevens parseren
Gebruik de volgende JSON-functies om JSON-gegevens te parseren. Hieronder verstaan we het ophalen van sleutels, waarden of complete JSON-objecten of arrays die u verder kunt verwerken:
-
JSONGetElement – Vraagt JSON-gegevens op voor een element (een object, array of waarde)
-
JSONListKeys – Geeft een lijst met de objectnamen (sleutels) of array-indexen in JSON-gegevens
-
JSONListValues – Geeft een lijst met de waarden in JSON-gegevens
De eerste parameter van deze functies, json
, geeft het tekstveld, de variabele of de tekstuitdrukking op die geldige JSON-gegevens bevat die kunnen worden bewerkt.
De tweede parameter, SleutelOfIndexOfPad
, geeft het deel van de JSON-gegevens op die moeten worden bewerkt:
-
sleutel – de naam van een sleutel in een JSON-object
-
index – de index van een element in een JSON-array (het eerste element heeft de index 0)
-
pad – een hiërarchische reeks sleutelnamen, array-indexen of beide
De volgende twee syntaxistypen voor de parameter SleutelOfIndexOfPad
worden ondersteund: notatie met punten en notatie met punthaken.
Syntaxis voor parameter |
Betekent |
|
Notatie met punten | Notatie met punthaken | |
---|---|---|
"." |
"" |
Het hoofdniveau, als het het eerste teken is (optioneel in notatie met punten) |
".[n]" |
"[n]" |
Elementen bij index n van een array op het hoofdniveau |
".naam" |
"['naam']" |
De sleutel van een object met de naam naam op het hoofdniveau |
".naamA.naamB.naamC" |
"['naamA']['naamB']['naamC']" |
Een object met de naam naamC dat een onderliggend element van naamB en naamA is |
".[3][2][1]naamA[0]" |
"[3][2][1]['naamA'][0]" |
Het eerste element van de array in het object naamA, dat zich op het derde niveau in een reeks geneste arrays bevindt |
Het verschil tussen de notatie met punten en die met punthaken is dat, in plaats dat er punten (.) worden gebruikt om sleutelnamen te scheiden, de sleutelnamen door enkele aanhalingstekens (') en punthaken ([]) worden omsloten. Beide notaties kunnen in SleutelOfIndexOfPad
worden gebruikt. U moet echter de notatie met punthaken gebruiken als de sleutelnamen punten bevatten, zodat de JSON-parser de hele sleutelnaam op de juiste wijze kan herkennen. Als bijvoorbeeld een sleutel op het hoofdniveau van een JSON-object "layout.response" is, dan wordt SleutelOfIndexOfPad
"['layout.response']".
Met het volgende voorbeeldscript wordt een record voor elk product in een JSON-array gemaakt. Aangenomen dat de Voorbeeld van JSON-gegevens worden opgeslagen in de variabele $$JSON, maakt het script gebruik van JSONListValues om de inhoud van de productarray op te halen als een lijst met waarden en wordt ValueCount gebruikt om het aantal producten in de lijst te bepalen. Telkens wanneer de lus wordt doorlopen wordt een record voor een product gemaakt en wordt gebruikgemaakt van GetValue om het JSON-object voor een product uit de lijst te halen en worden de velden ingesteld op de waarden die met behulp van JSONGetElement zijn verkregen. Omdat de JSON-functies het hele JSON-object parseren dat aan de functies wordt doorgegeven, kan het efficiënter zijn de JSON-functies te gebruiken voor kleinere JSON-objecten in een lus die vaak wordt herhaald.
Variabele instellen [ $ProductList ; Waarde: JSONListValues ( $$JSON ; "bakkerij.product" ) ]
Variabele instellen [ $ProductCount ; Waarde: ValueCount ( $ProductList ) ]
Variabele instellen [ $i; Waarde: 1 ]
If [ $ProductCount > 0 ]
Loop
Nieuwe record/nieuw verzoek
Variabele instellen [ $Product ; Waarde: GetValue ( $ProductList ; $i ) ]
Veld instellen [ Producten::ID ; JSONGetElement ( $Product ; "ID" ) ]
Veld instellen [ Producten::Prijs ; JSONGetElement ( $Product ; "prijs" ) ]
Veld instellen [ Producten::Voorraad ; JSONGetElement ( $Product ; "voorraad" ) ]
Records/verzoeken vastleggen [ Met dialoogvenster: Uit ]
Variabele instellen [ $i ; Waarde: $i + 1 ]
Exit Loop If [ $i > $ProductCount ]
End Loop
End If
JSON-gegevenselementen wijzigen en toevoegen
Gebruik de JSONSetElement functie om in JSON-gegevens waarden te wijzigen en elementen toe te voegen. De parameters json
en SleutelOfIndexOfPad
werken in deze functie zoals beschreven in JSON-gegevens parseren. Als in SleutelOfIndexOfPad
een bestaand element is opgegeven, wordt de waarde van dat element gewijzigd. Als het element niet bestaat, wordt een nieuw element toegevoegd.
JSONSetElement stelt het opgegeven element in op de parameter waarde
. U kunt een willekeurige geldige JSON-waarde opgeven, gaande van een eenvoudige tekenreeks of een getal tot een complex object of een complexe array.
De parameter type
geeft het type gegevens in waarde
op zodat de JSON-parser strikte regels volgt wanneer elk gegevenstype wordt verwerkt. Raadpleeg JSONSetElement functie voor de ondersteunde gegevenstypen. Om gegevens in json
in te voegen die al zijn opgemaakt als een geldig JSON-element, stelt u type
in op JSONRaw
.
In het volgende voorbeeld worden de sleutel-waarde-paren voor een nieuw product toegevoegd aan een leeg JSON-object. Het nieuwe object wordt dan toegevoegd aan het einde van de productarray in de $$JSON-variabele (raadpleeg Voorbeeld van JSON-gegevens).
Variabele instellen [ $NewProduct ; Waarde:
JSONSetElement ( "{}" ;
[ "id" ; "FB4" ; JSONString ] ;
[ "naam" ; "Vanillecake" ; JSONString ] ;
[ "prijs" ; 17.5 ; JSONNumber ] ;
[ "voorraad" ; 12 ; JSONNumber ] ;
[ "categorie" ; "Cakes" ; JSONString ] ;
[ "speciaal" ; waar ; JSONBoolean ]
) ]
Variabele instellen [ $NextIndex ; Waarde:
ValueCount (
JSONListKeys ($$JSON ; "bakkerij.product")
) ]
Variabele instellen [ $$JSON ; Waarde:
JSONSetElement (
$$JSON ; "bakkerij.product[" & $NextIndex & "]" ; $NewProduct ;
JSONObject
) ]
JSON-gegevenselementen verwijderen
Gebruik de JSONDeleteElement functie om een element te verwijderen. De parameters json
en SleutelOfIndexOfPad
werken in deze functie zoals beschreven in JSON-gegevens parseren. De parameter SleutelOfIndexOfPad
moet een bestaand element in json
opgeven.
In het volgende voorbeeld wordt het element verwijderd in de productarray waarvan de sleutel "id" de waarde "FB3" heeft in de $$JSON-variabele (raadpleeg Voorbeeld van JSON-gegevens).
Variabele instellen [ $ProductCount ; Waarde:
ValueCount (
JSONListKeys ($$JSON ; "bakkerij.product")
) ]
Variabele instellen [ $i ; Waarde: 0 ]
If [ $ProductCount > 0 ]
Loop
Variabele instellen [ $ID ; Waarde:
JSONGetElement ($$JSON ; "bakkerij.product[" & $i & "]id") ]
If [ $ID = "FB3" ]
Variabele instellen [ $$JSON ; Waarde:
JSONDeleteElement ($$JSON ; "bakkerij.product[" & $i & "]") ]
Script afsluiten [ Tekstresultaat: 0 ]
End If
Variabele instellen [ $i ; Waarde: $i + 1 ]
Exit Loop If [ $i ≥ $ProductCount ]
End Loop
End If
Fouten in JSON-gegevens verwerken
Als er een fout optreedt tijdens het parseren van de json
-parameter, geven de JSON-functies als resultaat "?" gevolgd door een foutbericht van de JSON-parser.
Wanneer bijvoorbeeld ":" na de sleutel "bakkerij" ontbreekt in Voorbeeld van JSON-gegevens, geeft deze berekening
JSONGetElement ($$JSON ; "bakkerij.product[0]id")
dit foutbericht als resultaat:
? * Line 3, Column 2
Missing ':' after object member name
* Line 13, Column 5
Extra non-whitespace after JSON value.
Om te bepalen of JSON-gegevens geldig zijn alvorens ze te gebruiken, gebruikt u de JSONFormatElements functie en test u of het eerste teken "?" is. Bijvoorbeeld:
Variabele instellen [ $result ; Waarde: JSONFormatElements ($$JSON) ]
If [ Left ($result ; 1) = "?" ]
# $$JSON bevat ongeldige JSON-gegevens.
End If
U kunt ook de JSONGetElementType functie gebruiken om te bepalen of JSON-gegevens geldig zijn voordat u ze gebruikt en testen of het hele object een JSON-object is. Bijvoorbeeld:
Variabele instellen [ $result ; Waarde: JSONGetElementType ( $$JSON, "" ) ]
If [ $result ≠ JSONObject ]
# $$JSON bevat ongeldige JSON-gegevens.
End If
JSON-gegevens vanaf een webservice ophalen
Gebruik de Invoegen vanuit URL scriptstap om toegang tot een webservice te krijgen, parameters voor de op te halen informatie op te geven, HTTP-headers te versturen en te ontvangen en de resultaten in een variabele of een veld op te slaan.
Bijvoorbeeld: een bakkerij maakt de lijst met producten beschikbaar voor klanten in JSON-structuur via een REST API. Het volgende geeft als resultaat de lijst met speciale gebakjes als JSON-gegevens in de $$JSON-variabele:
Variabele instellen [ $url ; "https://bakkerij.voorbeeld.com/rest/api/producten" ]
Invoegen vanuit URL [ Met dialoogvenster: Uit; Doel: $$JSON ; $url ; SSL-certificaten verifiëren ; cURL-opties: "--data list=speciale gebakjes" ]
Raadpleeg Voorbeeld van JSON-gegevens voor de gegevens die als resultaat in $$JSON worden verkregen.
FileMaker Pro biedt ook verschillende hulpfuncties die de tekencodering en de cryptografische ondertekening afhandelen die vereist zijn door bepaalde REST API’s:
Voorbeeld van JSON-gegevens
In het volgende voorbeeld bevatten de JSON-gegevens het object "Bakkerij" dat een array van drie "product"-objecten heeft, elk met verschillende sleutel-waarde-paren.
{
"bakkerij" :
{
"product" :
[
{
"id" : "FB1",
"naam" : "Donuts",
"prijs" : 1.99,
"voorraad" : 43,
"categorie" : "Broden",
"speciaal" : true
},
{
"id" : "FB2",
"prijs" : 22.5,
"naam" : "Chocoladecake",
"voorraad" : 23,
"categorie" : "Cakes",
"speciaal" : true
},
{
"id" : "FB3",
"prijs" : 3.95,
"naam" : "Stokbrood",
"voorraad" : 34,
"categorie" : "Broden",
"speciaal" : true
}
]
}
}
Opmerkingen
-
De JSON-parser behoudt de volgorde van elementen in een array maar niet de volgorde van elementen in een object. Daarom kunnen JSON-functies elementen in een object in een andere volgorde dan de opgegeven volgorde geven.
-
In JSON-gegevens moet in breuken een punt "." worden gebruikt als het decimaalteken, ongeacht het scheidingsteken dat is opgegeven in de systeeminstellingen van uw computer of de instellingen die zijn gebruikt bij het maken van het FileMaker Pro-bestand.