Crear una app personalizada > Trabajar con fórmulas y funciones > Uso de las funciones de JSON
 

Uso de las funciones de JSON

FileMaker Pro Advanced proporciona varias funciones de texto que permiten a la solución 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.

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:

Establecer variable [ $url ; "https://<nombre_dominio_panadería>/rest/api/productos" ]Insertar desde URL [ Verificar certificados SSL; Con diálogo: Inactivo; $$JSON ;
$url ; "--data lista=especialidades" ]

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

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

función HexDecode

función HexEncode

función TextDecode

función TextEncode

función Base64Decode

función Base64EncodeRFC

función CryptAuthCode

función CryptDigest

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 admite la siguiente sintaxis para el parámetro keyOrIndexOrPath.

 

Parámetro keyOrIndexOrPath

Indica que

"."

(Opcional) El nivel raíz, si es el primer carácter.

".[n]"

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

".nombre"

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

".nombreA.nombreB.nombreC"

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

".[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.

En el guión de ejemplo siguiente, se determina el número de productos de Datos de JSON de ejemplo (almacenados en la variable $$JSON) mediante JSONListKeys, se crea un registro de cada producto y, a continuación, se establecen los campos de cada registro en los valores obtenidos mediante JSONGetElement para cada producto.

Establecer variable [ $NúmeroProductos ; Valor:
   ValueCount (
      JSONListKeys ( $$JSON ; "panadería.producto" )
   ) ]
Establecer variable [ $i; Valor: 0 ]
If [ $NúmeroProductos > 0 ]
   Loop
      Nuevo registro/petición
      Establecer campo [ Productos::ID ;
         JSONGetElement ( $$JSON ; "panadería.producto[" & $i & "]id" ) ]
      Establecer campo [ Productos::Precio ;
         JSONGetElement ( $$JSON ; "panadería.producto[" & $i & "]precio" ) ]
      Establecer campo [ Productos::Existencias ;
         JSONGetElement ( $$JSON ; "panadería.producto[" & $i & "]existencias" ) ]
      Consignar registros/peticiones [ Con diálogo: Inactivo ]
      Establecer variable [ $i ; Valor: $i + 1 ]
      Exit Loop If [ $i $NúmeroProductos ]
   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).

Establecer variable [ $NuevoProducto ; 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 [ $ÍndiceSiguiente ; Valor:
   ValueCount (
      JSONListKeys ( $$JSON ; "panadería.producto" )
   ) ]
Establecer variable [ $$JSON ; Valor:
   JSONSetElement (
      $$JSON ; "panadería.producto[" & $ÍndiceSiguiente & "]" ; $NuevoProducto ;
      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).

Establecer variable [ $NúmeroProductos ; Valor:
   ValueCount (
      JSONListKeys ( $$JSON ; "panadería.producto" )
   ) ]
Establecer variable [ $i ; Valor: 0 ]
If [ $NúmeroProductos > 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 $NúmeroProductos ]
   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

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

devuelve este mensaje de error:

? * 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:

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

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.

{
"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.

Temas relacionados 

Funciones de texto

Funciones de campos contenedor