FileMaker Pro Advanced heeft verschillende tekstfuncties waarmee uw oplossing 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.
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 Advanced heeft ook verschillende hulpfuncties die de tekencodering en de cryptografische ondertekening vereist door bepaalde REST API's ondersteunen:
•CryptGenerateSignature functie
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.
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 syntaxis voor de parameter SleutelOfIndexOfPad
wordt ondersteund.
Parameter | Betekent |
"." | (optioneel) Het hoofdniveau, als het het eerste teken is |
".[n]" | Elementen bij index n van een array op het hoofdniveau |
".naam" | De sleutel van een object met de naam naam op het hoofdniveau |
".naamA.naamB.naamC" | Een object met de naam naamC dat een onderliggend element van naamB en naamA is |
".[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 |
In het volgende voorbeeldscript wordt het aantal producten in het Voorbeeld van JSON-gegevens bepaald (opgeslagen in de $$JSON-variabele) met behulp van JSONListKeys, wordt een record voor elk product gemaakt en worden velden in elke record ingesteld op de waarden die met JSONGetElement voor elk product worden verkregen.
Variabele instellen [ $ProductCount ; Waarde:
ValueCount (
JSONListKeys ( $$JSON ; "bakkerij.product" )
) ]
Variabele instellen [ $i; Waarde: 0 ]
If [ $ProductCount > 0 ]
Loop
Nieuwe record/nieuw verzoek
Veld instellen [ Producten::ID ;
JSONGetElement ( $$JSON ; "bakkerij.product[" & $i & "]id" ) ]
Veld instellen [ Producten::Prijs ;
JSONGetElement ( $$JSON ; "bakkerij.product[" & $i & "]prijs" ) ]
Veld instellen [ Producten::Voorraad ;
JSONGetElement ( $$JSON ; "bakkerij.product[" & $i & "]voorraad" ) ]
Records/verzoeken vastleggen [ Met dialoogvenster: Uit ]
Variabele instellen [ $i ; Waarde: $i + 1 ]
Exit Loop If [ $i ≥ $ProductCount ]
End Loop
End If
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
) ]
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
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
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" :
{
"producten" :
[
{
"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
}
]
}
}
•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.