Arbeta med JSON-funktionerna

FileMaker Pro erbjuder flera textfunktioner som gör att anpassade appar kan tolka och ändra JSON-data från andra källor, till exempel webbtjänster som överför data i JSON-format via en REST API.

Mer information om JSON-dataformatet finns i json.org.

Formatera JSON-data

JSON-data kräver inte mellanslag eller radbrytningar mellan element. Du kan däremot göra det lättare att läsa data när du debuggar problem genom att använda Funktionen JSONFormatElements, vilket lägger till tabbar och radslutstecken, som vi visar i Exempel på JSON-data.

Tolka JSON-data

Använd följande JSON-funktioner för att tolka JSON-data, dvs. för att hämta nycklar, värden eller hela JSON-objekt eller -matriser som du kan behandla vidare:

  • JSONGetElement – Frågar JSON-data om ett element (ett objekt, en matris eller ett värde.

  • JSONListKeys – Listar objektnamnen (nycklar) eller matrisindex i JSON-data

  • JSONListValues – Listar värden i JSON-data

Den första parametern för dessa funktioner, json, anger textfältet, variabeln eller textuttrycket som innehåller giltiga JSON-data att använda.

Den andra parametern, nyckelEllerIndexEllerSökväg, anger vilken del av JSON-data som ska användas:

  • nyckel – namnet på en nyckel i ett JSON-objekt

  • index – index för ett element i en JSON-matris (det första elementet har ett index på 0)

  • sökväg – en hierarkisk sträng av nyckelnamn, matrisindex eller både och

Följande två syntaxtyper för parametern nyckelEllerIndexEllerSökväg stöds: punktnotation och parentesnotation.

Syntax för parametern nyckelEllerIndexEllerSökväg

Betydelse

Punktnotation Parentesnotation (v19.3.1)

"."

""

Roten, om det är det första tecknet (valfritt i punktnotation)

".[n]"

"[n]"

Element vid index n av en matris i roten

".namn"

"['namn']"

Nyckeln till ett objekt med namnet namn i roten

".namnA.namnB.namnC"

"['namnA']['namnB']['namnC']"

Ett objekt med namnet namnC, som är underordnad namnB och namnA

".[3][2][1]namnA[0]"

"[3][2][1]['namnA'][0]"

Det första elementet för matrisen i objektet namnA, vilket är på den tredje nivån i en uppsättning av kapslade matriser

Skillnaden mellan punkt- och parentesnotation är att i stället för att använda punkter (.) för att särskilja nyckelnamn, omger man i parentesnotation nyckelnamnen med enkla citattecken (') och klammerparenteser ([]). Du kan använda vilken notation du vill i nyckelEllerIndexEllerSökväg. Dock måste du använda parentesnotation om nyckelnamnen innehåller punkter, så att JSON-tolken korrekt kan identifiera hela nyckelnamnet. Om till exempel en nyckel i roten till ett JSON-objekt är "layout.svar", skulle nyckelEllerIndexEllerSökväg vara "['layout.svar']".

Följande exempelscript skapar en post för varje produkt i en JSON-matris. Om vi antar att Exempel på JSON-data är lagrat i variabeln $$JSON, så använder scriptet JSONListValues för att hämta innehållet i produktmatrisen som en lista med värden och använder ValueCount för att avgöra antalet produkter i listan. Scriptet skapar en post för en produkt varje gång per loop och använder GetValue för att hämta JSON-objektet för en produkt från listan och anger fälten till de värden som hämtats med hjälp av JSONGetElement. Eftersom JSON-funktionerna tolkar hela JSON-objektet som skickats till dem kan det vara mer effektivt att använda JSON-funktioner på mindre JSON-objekt inuti en loop som upprepas många gånger.

Kopiera
Ange variabel [ $Produktlista ; Värde: JSONListValues ( $$JSON ; "bageri.produkt" ) ]
Ange variabel [ $ProduktAntal ; Värde: ValueCount ( $Produktlista ) ]
Ange variabel [ $i; Värde: 1 ]
If [ $ProduktAntal > 0 ]
   Loop
      Ny post/sökpost
      Ange variabel [ $Produkt ; Värde: GetValue ( $Produktlista ; $i ) ]
      Tilldela fält [ Produkter::ID ; JSONGetElement ( $Produkt ; "id" ) ]
      Tilldela fält [ Produkter::Pris ; JSONGetElement ( $Produkt ; "pris" ) ]
      Tilldela fält [ Produkter::Lager ; JSONGetElement ( $Produkt ; "lager" ) ]
      Verkställ post/sökpost [ Med dialogruta: Av ]
      Ange variabel [ $i ; Värde: $i + 1 ] 
      Exit Loop If [ $i > $ProduktAntal ]
   End Loop
End If

Ändra och lägga till JSON-dataelement

Ändra värden och lägg till element i JSON-data med hjälp av Funktionen JSONSetElement. Parametrarna json och nyckelEllerIndexEllerSökväg fungerar i den här funktionen enligt beskrivningen i Tolka JSON-data. Om nyckelEllerIndexEllerSökväg anger ett befintligt element ändras värdet för det elementet; om elementet inte finns läggs ett nytt element till.

JSONSetElement anger det specificerade elementet till värde-parametern. Vilka giltiga JSON-värden som helst kan anges, från enkla strängar eller tal till komplicerade objekt eller matriser.

Parametern typ anger typen av data i värde så att JSON-tolkaren följer strikta regler vid hantering av varje datatyp. Information om vilka datatyper som stöds finns i Funktionen JSONSetElement. För att infoga data i json som redan är formaterad som ett giltigt JSON-element, anger du JSONRaw som typ.

Följande exempel lägger till nyckelvärdesparen för en ny produkt till ett tomt JSON-objekt. Det nya objektet läggs till i slutet av produktmatrisen i $$JSON-variabeln (mer information finns i Exempel på JSON-data).

Kopiera
Ange variabel [ $NyProdukt ; Värde: 
   JSONSetElement ( "{}" ;
      [ "id" ; "FB4" ; JSONString ] ; 
      [ "namn" ; "Vaniljtårta" ; JSONString ] ; 
      [ "pris" ; 17.5 ; JSONNumber ] ; 
      [ "lager" ; 12 ; JSONNumber ] ; 
      [ "kategori" ; "Tårtor" ; JSONString ] ; 
      [ "special" ; true ; JSONBoolean ] 
   ) ]
Ange variabel [ $NästaIndex ; Värde: 
   ValueCount ( 
      JSONListKeys ( $$JSON ; "bageri.produkt" ) 
   ) ] 
Ange variabel [ $$JSON ; Värde: 
   JSONSetElement ( 
      $$JSON ; "bageri.produkt[" & $NästaIndex & "]" ; $NyProdukt ; 
      JSONObject 
   ) ]

Ta bort JSON-dataelement

Radera ett element med hjälp av Funktionen JSONDeleteElement. Parametrarna json och nyckelEllerIndexEllerSökväg arbetar i den här funktionen enligt beskrivningen i Tolka JSON-data. Parametern nyckelEllerIndexEllerSökväg måste ange ett befintligt element i json.

Följande exempel tar bort elementet i den produktmatris vars "id-nyckel" har värdet "FB3" i $$JSON-variabeln (mer information finns i Exempel på JSON-data).

Kopiera
Ange variabel [ $ProduktAntal ; Värde: 
   ValueCount ( 
      JSONListKeys ( $$JSON ; "bageri.produkt" ) 
   ) ] 
Ange variabel [ $i ; Värde: 0 ]
If [ $ProduktAntal > 0 ]
   Loop
      Ange variabel [ $ID ; Värde: 
         JSONGetElement ( $$JSON ; "bageri.produkt[" & $i & "]id" ) ]
      If [ $ID = "FB3" ]
         Ange variabel [ $$JSON ; Värde: 
            JSONDeleteElement ( $$JSON ; "bageri.produkt[" & $i & "]" ) ]
         Avsluta script [ Textresultat: 0 ]
      End If
      Ange variabel [ $i ; Värde: $i + 1 ]
      Exit Loop If [ $i ≥ $ProduktAntal ]
   End Loop
End If

Hantera fel i JSON-data

Om det uppstår ett fel när json-parametern tolkas returnerar JSON-funktionerna "?" följt av ett felmeddelande från JSON-tolken.

Till exempel, när ":" efter "bageri" saknas i Exempel på JSON-data, returnerar den här beräkningen

Kopiera
JSONGetElement ( $$JSON ; "bageri.produkt[0]id" )

följande felmeddelande:

Kopiera
* Line 3, Column 2
  Missing ':' after object member name
* Line 13, Column 5
  Extra non-whitespace after JSON value.

Du kan bedöma om JSON-data är giltiga innan du använder dem genom att använda Funktionen JSONFormatElements och testa om det första tecknet är "?". Till exempel:

Kopiera
Ange variabel [ $resultat ; Värde: JSONFormatElements ( $$JSON ) ]
If [ Left ( $result ; 1 ) = "?"
   # $$JSON innehåller ogiltiga JSON-data.
End If

v19.5.1: Alternativt kan du bedöma om JSON-data är giltiga innan du använder dem genom att använda Funktionen JSONGetElementType och testa om hela objektet är ett JSON-objekt. Till exempel:

Kopiera
Ange variabel [ $resultat ; Värde: JSONGetElementType( $$JSON, "" ) ]
If [ $result ≠ JSONObject ]
    # $$JSON innehåller ogiltiga JSON-data.
End If

Hämtar JSON-data från en webbtjänst

Använd Scriptsteget Infoga från URL för att öppna en webbtjänst, ange parametrar för informationen som ska hämtas, skicka och ta emot HTTP-rubriker och lagra resultaten i en variabel eller ett fält.

Ett bageri gör exempelvis sin produktlista tillgänglig för klienter i JSON-format via en REST API. Följande returnerar listan över dagens specialerbjudanden som JSON-data i $$JSON-variabeln:

Kopiera
Ange variabel [ $url ; "https://bageri.exempel.com/rest/api/produkter" ]
Kopiera
Infoga från URL [ Med dialogruta: Av; Mål: $$JSON ; $url ; Verifiera SSL-certifikat ; cURL-tillval: "--data list=specials" ]

Information om data som returneras i $$JSON finns i Exempel på JSON-data.

FileMaker Pro erbjuder även flera programfunktioner som hanterar den teckentabell och kryptografiska signeringen som krävs av vissa REST API-er:

Exempel på JSON-data

Följande exempel på JSON-data innehåller ett "bageriobjekt" som har en matris av tre produktobjekt, vart och ett med flera nyckelvärdespar.

Kopiera
{
    "bageri"
    {
        "produkt"
        [
            {
                "id" : "FB1",
                "namn" : "Munkar",
                "pris" : 1.99,
                "lager" : 43,
                "kategori" : "Bröd",
                "special" : true
            },
            {
                "id" : "FB2",
                "pris" : 22.5,
                "namn" : "Chokladtårta",
                "lager" : 23,
                "kategori" : "Tårtor"
                "special" : true
            },
            {
                "id" : "FB3",
                "pris" : 3.95,
                "namn" : "Baguette",
                "lager" : 34,
                "kategori" : "Bröd"
                "special" : true
            }
        ]
    }
}

Kommentarer 

  • JSON-tolkaren bevarar ordningen på elementen i en matris, men inte ordningen på elementen i ett objekt. JSON-funktioner kan därför returnera element i ett objekt i en annan ordning än den angivna.

  • I JSON-data måste numeriska bråktal använda punkt "." som decimaltecken oavsett vilket tecken som anges av datorns systemformat eller de format som användes när FileMaker Pro-filen skapades.