FileMaker Pro Advanced 提供若干个文本函数,您的解决方案可通过这些函数从其他源解析和修改 JSON 数据,如通过 REST API 传输 JSON 格式数据的 Web 服务。
有关 JSON 数据格式的更多信息,请参阅 json.org。
使用从 URL 插入访问 Web 服务,指定要检索的信息的参数,发送和接收 HTTP 标头,并在变量或字段中存储结果。
例如,一家面包店通过 REST API 采用 JSON 格式使其产品列表可用于客户。以下脚本将当日特价列表作为 $$JSON 变量中的 JSON 数据返回:
设置变量 [$url ; "https://bakery.example.com/rest/api/products"]
从 URL 插入 [包括对话框: Off; Target: $$JSON ; $url ; 验证 SSL 证书 ; cURL 选项: "--data list=特价"]
有关在 $$JSON 中返回的数据,请参阅 JSON 数据示例。
FileMaker Pro Advanced 还提供若干个实用程序功能,用来处理一些 REST API 所需的字符编码和加密签名:
JSON 数据不需要元素之间有空格或行结束符。但是,为了使数据在您调试问题时更易读,请使用 JSONFormatElements 函数,该函数会添加制表符和行结束符,如 JSON 数据示例中所示。
使用以下 JSON 函数解析 JSON 数据—即,要获得键、值或您可以进一步处理的全部 JSON 对象或数组:
•JSONGetElement – 在 JSON 数据中查询元素(对象、数组或值)
•JSONListKeys – 列出 JSON 数据中的对象名称(键)或数组索引
•JSONListValues – 列出 JSON 数据中的值
这些函数的第一个参数 json
指定包含要操作的有效 JSON 数据的文本字段、变量或文本表达式。
第二个参数键或索引或路径
指定要操作的 JSON 数据的部分:
•键 – JSON 对象中键的名称
•索引 – JSON 数组中元素的索引(第一个元素的索引为 0)
•路径 – 键名称、数组索引或二者的层级字符串
支持键或索引或路径
参数的以下语法。
| 表示 |
"." | (可选)如果是第一个字符,则为根级别 |
".[n]" | 根级别数组的索引 n 处的元素 |
".name" | 位于根级别的名为 name 的对象的关键字 |
".nameA.nameB.nameC" | 名为 nameC 的对象,其为 nameB 和 nameA 的后代 |
".[3][2][1]nameA[0]" | nameA 对象中数组的第一个元素,其在一组嵌套数组中位于第三个级别 |
以下示例脚本使用 JSONListKeys 确定 JSON 数据示例中的产品数(存储在 $$JSON 变量中)使用 JSONListKeys,为每个产品创建一条记录,然后将每个记录中的字段设置为使用 JSONGetElement 为每个产品获取的值。
设置变量 [$ProductCount ; 值:
ValueCount (
JSONListKeys ($$JSON ; "面包店.产品")
)]
设置变量 [$i; 值: 0]
If [$ProductCount > 0]
Loop
新建记录/请求
设置字段 [产品::ID ;
JSONGetElement ($$JSON ; "面包店.产品[" & $i & "]id")]
设置字段 [产品::价格 ;
JSONGetElement ($$JSON ; "面包店.产品[" & $i & "]价格")]
设置字段 [产品::现货 ;
JSONGetElement ($$JSON ; "面包店.产品[" & $i & "]现货")]
提交记录/请求 [包括对话框: 关闭]
设置变量 [$i ; 值: $i + 1]
Exit Loop If [$i ≥ $产品数量]
End Loop
End If
要在 JSON 数据中更改值并添加元素,请使用 JSONSetElement 函数。json
和键或索引或路径
参数在此函数中像解析 JSON 数据所描述的那样运行。如果键或索引或路径
指定现有元素,则该元素的值将被更改;如果元素不存在,会添加一个新元素。
JSONSetElement 将指定的元素设置为值
参数。您可以指定从简单字符串或数字到复杂对象或数组的任何有效的 JSON 值。
类型
参数指定值
中的数据类型,以使 JSON 分析器在处理每种数据类型时都将遵循限制规则。有关支持的数据类型,请参阅 JSONSetElement 函数。要将数据插入到已设置为有效 JSON 元素格式的 json
中,请将类型
设置为 JSONRaw
。
下面的示例将新产品的键值对添加到空的 JSON 对象中。然后,新对象添加到 $$JSON 变量中产品数组的末尾(请参阅 JSON 数据示例)。
设置变量 [$NewProduct ; 值:
JSONSetElement ("{}" ;
["id" ; "FB4" ; JSONString] ;
["名称" ; "香草蛋糕" ; JSONString] ;
["价格" ; 17.5 ; JSONNumber] ;
["现货" ; 12 ; JSONNumber] ;
["类别" ; "蛋糕" ; JSONString] ;
["特价" ; true ; JSONBoolean]
)]
设置变量 [$NextIndex ; 值:
ValueCount (
JSONListKeys ($$JSON ; "面包店.产品")
)]
设置变量 [$$JSON ; 值:
JSONSetElement (
$$JSON ; "面包店.产品[" & $NextIndex & "]" ; $NewProduct ;
JSONObject
)]
要删除元素,请使用 JSONDeleteElement 函数。json
和键或索引或路径
参数在此函数中像解析 JSON 数据所描述的那样运行。键或索引或路径
参数必须指定 json
中的现有元素。
以下示例将删除产品数组中"id"键在 $$JSON 变量中的值为"FB3"的元素(请参阅 JSON 数据示例)。
设置变量 [$产品数量 ; 值:
ValueCount (
JSONListKeys ($$JSON ; "面包店.产品")
)]
设置变量 [$i ; 值: 0]
If [$产品数量 > 0]
Loop
设置变量 [$ID ; 值:
JSONGetElement ($$JSON ; "面包店.产品[" & $i & "]id")]
If [$ID = "FB3"]
设置变量 [$$JSON ; 值:
JSONDeleteElement ($$JSON ; "面包店.产品[" & $i & "]")]
退出脚本 [文本结果: 0]
End If
设置变量 [$i ; 值: $i + 1]
Exit Loop If [$i ≥ $产品数量]
End Loop
End If
如果在解析 json
参数时出错,JSON 函数会返回"?",后面跟着一条来自 JSON 分析器的错误消息。
例如,如果 JSON 数据示例中"面包店"键后面缺少":",则计算
JSONGetElement ($$JSON ; "面包店.产品[0]id")
返回下面的错误消息:
? * Line 3, Column 2
Missing ':' after object member name
* Line 13, Column 5
Extra non-whitespace after JSON value.
要在使用 JSON 数据之前确定其是否有效,请使用 JSONFormatElements 函数并测试第一个字符是否为"?"。例如:
设置变量 [$结果 ; 值: JSONFormatElements ($$JSON)]
If [Left ($结果 ; 1) = "?"]
# $$JSON 包含无效 JSON 数据。
End If
以下 JSON 数据示例包含一个"面包店"对象,其包含由三个"产品"对象组成的数组,每个对象都有几个键值对。
{
"面包店" :
{
"产品" :
[
{
"id" : "FB1",
"名称" : "面包圈",
"价格": 1.99,
"现货" : 43,
"类别" : "面包",
"特价" : 真
},
{
"id" : "FB2",
"价格": 22.5,
"名称" : "巧克力蛋糕",
"现货" : 23,
"类别" : "蛋糕",
"特价" : 真
},
{
"id" : "FB3",
"价格": 3.95,
"名称" : "法棍面包",
"现货" : 34,
"类别" : "面包",
"特价" : 真
}
]
}
}
•JSON 分析器保留数组中元素的顺序,但不保留对象中元素的顺序。因此,JSON 函数返回对象中的元素的顺序可能与指定的顺序不同。