Uso de las funciones de JSON

FileMaker Pro proporciona varias funciones de texto que permiten a la app personalizada analizar y modificar datos de JSON de otras fuentes, como servicios Web que transfieren datos en formato JSON a través de una API REST.

Para obtener más información sobre el formato de datos de JSON, consulte json.org.

Aplicar formato a datos de JSON

Los datos de JSON no requieren espacios o finales de línea entre elementos. Sin embargo, para simplificar las lecturas de datos al depurar problemas, utilice la función JSONFormatElements, que añade tabuladores y caracteres de final de línea, como se muestra en Datos de JSON de ejemplo.

Analizar datos de JSON

Utilice las siguientes funciones de JSON para analizar datos de JSON, es decir, para obtener claves, valores, o matrices u objetos de JSON completos que puede procesar de forma adicional:

  • JSONGetElement: realiza consultas en los datos de JSON de un elemento (un objeto, una matriz o un valor).

  • JSONListKeys: enumera los nombres (claves) de objeto o los índices de matriz de los datos de JSON.

  • JSONListValues: enumera los valores de los datos de JSON

El primer parámetro de estas funciones, json, especifica el campo de texto, la variable o la expresión de texto que contiene los datos de JSON válidos con los que se trabajará.

El segundo parámetro, keyOrIndexOrPath, especifica la parte de los datos de JSON con los que se trabajará:

  • Clave: el nombre de un clave de un objeto de JSON.

  • Índice: el índice de un elemento de una matriz de JSON (el primer elemento tiene un índice 0).

  • Ruta: una cadena jerárquica de nombres de clave, índices de matriz o ambos elementos.

Se admiten los dos siguientes tipos de sintaxis para el parámetro keyOrIndexOrPath: notación de puntos y notación de corchetes.

Sintaxis del parámetrokeyOrIndexOrPath

Indica que

Notación de puntos Notación de corchetes

"."

""

El nivel raíz, si es el primer carácter (opcional en la notación de puntos).

".[n]"

"[n]"

Elementos en el índice n de una matriz en el nivel raíz.

".nombre"

"['nombre']"

La clave de un objeto denominado nombre en el nivel raíz.

".nombreA.nombreB.nombreC"

"['nombreA']['nombreB']['nombreC']"

Un objeto denominado nombreC, que desciende de nombreB y nombreA.

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

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

El primer elemento de la matriz del objeto nombreA, que es el tercer nivel de un conjunto de matrices anidadas.

La diferencia entre la notación de puntos y la de corchetes es que, en lugar de utilizar puntos (.) para separar los nombres de las claves, la notación de corchetes rodea los nombres de las claves con comillas simples (') y corchetes ([]). Puede utilizar cualquiera de las dos notaciones en keyOrIndexOrPath. Sin embargo, debe utilizar la notación de corchetes si los nombres de las claves incluyen puntos para que el analizador JSON pueda identificar correctamente el nombre completo de la clave. Por ejemplo si una clave en la raíz de un objeto JSON es "layout.response", keyOrIndexOrPath será "['layout.response']".

El siguiente guión de ejemplo crea un registro para cada producto de una matriz JSON. Suponiendo que los Datos de JSON de ejemplo se han almacenado en la variable $$JSON, el guión utiliza JSONListValues para obtener el contenido de la matriz de productos como una lista de valores y usa ValueCount para determinar la cantidad de productos de la lista. Al crear un registro para un producto cada vez que pasa por el bucle, el guión utiliza GetValue para obtener el objeto JSON de un producto de la lista y establece los campos en los valores obtenidos mediante JSONGetElement. Debido a que las funciones JSON analizan todo el objeto JSON transferido, puede ser más eficaz utilizar las funciones JSON en objetos JSON más pequeños dentro de un bucle que se repite muchas veces.

Copiar
Establecer variable [ $ProductList ; Valor: JSONListValues ( $$JSON ; "panadería.producto" ) ]
Establecer variable [ $ProductCount ; Valor: ValueCount ( $ProductList ) ]
Establecer variable [ $i; Valor: 1 ]
If [ $ProductCount > 0 ]
   Loop
      Nuevo registro/petición
      Establecer variable [ $Product ; Valor: GetValue ( $ProductList ; $i ) ]
      Establecer campo [ Productos::ID ; JSONGetElement ( $Product ; "id" ) ]
      Establecer campo [ Productos::Precio ; JSONGetElement ( $Product ; "precio" ) ]
      Establecer campo [ Productos::Existencias ; JSONGetElement ( $Product ; "existencias" ) ]
      Consignar registros/peticiones [ Con diálogo: Inactivo ]
      Establecer variable [ $i ; Valor: $i + 1 ] 
      Exit Loop If [ $i > $ProductCount ]
   End Loop
End If

Modificar y añadir elementos de datos de JSON

Para modificar valores y añadir elementos a los datos de JSON, utiliza la función JSONSetElement. Los parámetros json y keyOrIndexOrPath de esta función presentan el funcionamiento descrito en Analizar datos de JSON. Si keyOrIndexOrPath especifica un elemento existente, se modifica el valor de ese elemento; si el elemento no existe, se añade uno nuevo.

JSONSetElement establece el elemento especificado en el parámetro valor. Puede especificar cualquier valor de JSON válido, desde una cadena o número sencillos hasta una matriz o un objeto complejos.

El parámetro tipo especifica el tipo de datos del valor, por lo que analizador de JSON seguirá reglas estrictas al administrar cada tipo de datos. Para obtener información sobre los tipos de datos admitidos, consulte función JSONSetElement. Para insertar datos en json con un formato existente como elemento JSON válido, establezca type en JSONRaw.

En el siguiente ejemplo, se añaden los pares de clave-valor de un nuevo producto a un objeto de JSON vacío. A continuación, se añade el nuevo objeto al final de la matriz de productos de la variable $$JSON (consulte Datos de JSON de ejemplo).

Copiar
Establecer variable [ $NewProduct ; Valor: 
   JSONSetElement ( "{}" ;
      [ "id" ; "FB4" ; JSONString ] ; 
      [ "nombre" ; "Tarta de vainilla" ; JSONString ] ; 
      [ "precio" ; 17.5 ; JSONNumber ] ; 
      [ "existencias" ; 12 ; JSONNumber ] ; 
      [ "categoría" ; "Tartas" ; JSONString ] ; 
      [ "especialidad" ; true ; JSONBoolean ] 
   ) ]
Establecer variable [ $NextIndex ; Valor: 
   ValueCount ( 
      JSONListKeys ( $$JSON ; "panadería.producto" ) 
   ) ] 
Establecer variable [ $$JSON ; Valor: 
   JSONSetElement ( 
      $$JSON ; "panadería.producto[" & $NextIndex & "]" ; $NewProduct ; 
      JSONObject 
   ) ]

Eliminar elementos de datos de JSON

Para eliminar un elemento, utilice la función JSONDeleteElement. Los parámetros json y keyOrIndexOrPath de esta función presentan el funcionamiento descrito en Analizar datos de JSON. El parámetro keyOrIndexOrPath debe especificar un elemento existente en json.

En el siguiente ejemplo, se elimina el elemento de la matriz de productos cuya clave "id" presenta el valor "FB3" en la variable $$JSON (consulte Datos de JSON de ejemplo).

Copiar
Establecer variable [ $ProductCount ; Valor: 
   ValueCount ( 
      JSONListKeys ( $$JSON ; "panadería.producto" ) 
   ) ] 
Establecer variable [ $i ; Valor: 0 ]
If [ $ProductCount > 0 ]
   Loop
      Establecer variable [ $ID ; Valor: 
         JSONGetElement ( $$JSON ; "panadería.producto[" & $i & "]id" ) ]
      If [ $ID = "FB3" ]
         Establecer variable [ $$JSON ; Valor: 
            JSONDeleteElement ( $$JSON ; "panadería.producto[" & $i & "]" ) ]
         Salir del guión [ Resultado de texto: 0 ]
      End If
      Establecer variable [ $i ; Valor: $i + 1 ]
      Exit Loop If [ $i ≥ $ProductCount ]
   End Loop
End If

Administrar errores en los datos de JSON

Si se produce un error al analizar el parámetro json, la función de JSON devuelve "?" seguido de un mensaje de error del analizador de JSON.

Por ejemplo, cuando falta el signo ":" tras la clave "panadería" en Datos de JSON de ejemplo, este cálculo

Copiar
JSONGetElement ( $$JSON ; "panadería.producto[0]id" )

devuelve este mensaje de error:

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

Para determinar si los datos de JSON son válidos antes de utilizarlos, use la función JSONFormatElements y compruebe si el primer carácter es "?". Por ejemplo:

Copiar
Establecer variable [ $resultado; Valor: JSONFormatElements ( $$JSON ) ]
If [ Queda(n) ( $resultado ; 1 ) = "?" ]
   # $$JSON contiene datos de JSON no válidos
End If

De forma alternativa, para determinar si los datos de JSON son válidos antes de utilizarlos, use la función JSONGetElementType y compruebe si todo el objeto es un objeto JSON. Por ejemplo:

Copiar
Establecer variable [ $resultado; Valor: JSONGetElementType ( $$JSON, "" ) ]
If [ $result ≠ JSONObject ]
    # $$JSON contiene datos de JSON no válidos
End If

Recuperar datos de JSON de un servicio Web

Utilice el paso de guión Insertar desde URL para acceder a un servicio Web, especificar parámetros para la información que se va a recuperar, enviar y recibir encabezados HTTP y almacenar los resultados en una variable o un campo.

Por ejemplo, una panadería facilita su lista de productos a los clientes en formato JSON mediante una API REST. A continuación se devuelve la lista de las especialidades del día como datos de JSON en la variable $$JSON:

Copiar
Establecer variable [ $url ; "https://panadería.ejemplo.com/rest/api/productos" ]
Copiar
Insertar desde URL [ Con diálogo: Inactivo; Destino: $$JSON ; $url ; Verificar certificados SSL ; opciones de cURL: "--data list=specials" ]

Para obtener información sobre los datos devueltos en $$JSON, consulte Datos de JSON de ejemplo.

FileMaker Pro proporciona también varias funciones de utilidad que administran la codificación de caracteres y la firma criptográfica necesarios para algunas API REST:

Datos de JSON de ejemplo

En el siguiente ejemplo, los datos de JSON contienen un objeto "panadería" que tiene una matriz de tres objetos "producto", cada uno con varios pares clave-valor.

Copiar
{
    "panadería"
    {
        "producto"
        [
            {
                "id" : "FB1",
                "nombre" : "Rosquillas",
                "precio" : 1.99,
                "existencias" : 43
                "categoría" : "Panes",
                "especialidad" : true
            },
            {
                "id" : "FB2",
                "precio" : 22.5,
                "nombre" : "Tarta de chocolate",
                "existencias" : 23,
                "categoría" : "Tartas"
                "especialidad" : true
            },
            {
                "id" : "FB3",
                "precio" : 3.95,
                "nombre" : "Baguette",
                "existencias" : 34,
                "categoría" : "Panes"
                "especialidad" : true
            }
        ]
    }
}

Notas 

  • El analizador de JSON conserva el orden de los elementos de la matriz, pero no el orden de los elementos de un objeto. Por lo tanto, es posible que las funciones de JSON devuelvan elementos de un objeto en un orden diferente al especificado.

  • En los datos JSON, los valores numéricos fraccionarios deben usar un punto "." como separador decimal independientemente del separador especificado por los formatos del sistema del equipo o los formatos utilizados cuando se creó el archivo de FileMaker Pro.