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.
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:
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.
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 | 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
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
) ]
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
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
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
}
]
}
}
•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.