JSON / CFML - 遍历结构数组
JSON / CFML - Looping over an array of structs
我正在为我的业务测试一个名为条码扫描仪终端的应用程序;我想用它来代替时钟。
员工可以扫描他们 ID 徽章上的条形码或二维码,此应用会将其连同时间戳甚至 GPS 坐标一起发送到我的服务器,以验证他们是否在正确的时间出现在正确的地点.当 phone 连接到 Internet 时,此信息将通过我网站上的特殊 URL 传递,我可以使其完美运行。
问题是什么?
当没有互联网时,phone 将扫描结果存储在本地,您可以稍后将其发送到您的服务器。这些扫描存储为 JSON 结构数组。
According to the documentation
...以这种方式存储的数据可以作为 POST 请求发送到服务器。我不确定如何测试所有这些,所以我只是设置了一些变量,进行了扫描,然后收到一封电子邮件,其中转储了它们所代表的值。
<cfset requestBody = toString( getHttpRequestData().content )/>
退回了这个怪物和许多其他喜欢它的人;您在下面看到的是一次扫描。
batch=%5B%7B%22barcode%22%3A%22CSS1959%22%2C%22scannerID%22%3A%223e81b04aa521a05e%22%2C%22time%22%3A%222015-08-11+08%3A28%3A20.419%22%2C%22lat%22%3A32.3999433%2C%22long%22%3A-110.040379%7D%5D
所以我 运行 通过 URLDecode() 函数得到看起来更熟悉的东西。
<cfset decodedBody = #URLDecode(requestBody)#>
<!--- This would output the following. Line breaks are for ease of reading. --->
batch=[{"barcode":"CSS1959","scannerID":"3e81b04aa521a05e",
"time":"2015-08-11 08:28:20.419","lat":32.3999433,"long":-110.040379}]
所以最终我有一堆扫描在 JSON 中形成了这个结构数组,但我不知道如何处理它。
batch=[
{"barcode":"CSS1035","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:27.232","lat":32.4001579,"long":-110.0403455},
{"barcode":"CSS1959","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:29.366","lat":32.4001579,"long":-110.0403455},
{"barcode":"CSS1649","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:31.642","lat":32.4001579,"long":-110.0403455}
]
我正在尝试遍历它并将它们全部插入数据库。
到目前为止,我已经有了这个,但我遇到了一个 JSON 解析错误。
<cfset requestBody = toString( getHttpRequestData().content ) />
<cfset decodedBody = #URLDecode(requestBody)#>
<!---This is where I falter because I have no idea how to handle it.--->
<cfset arrayOfStructs = deserializeJson(decodedBody)>
<cfloop array="#arrayOfStructs#" index="barcode">
blah blah query logic
</cfloop>
这是我得到的错误。
谢谢!
编辑:解决部分感谢我在这里收到的帮助。解决方案如下:
<cfset requestBody = #replaceNoCase( toString(getHttpRequestData().content), "batch=", "" )# />
<cfset decodedBody = #URLDecode(requestBody)#>
<cfset ArrayOfStructs = deserializeJson(decodedBody)>
<cfloop array="#ArrayOfStructs#" index="i">
<cfquery name="doodoodoo" datasource="CRM">
INSERT INTO TimeAppTest
(
EmployeeID,
lat,
long,
TimoStampo
)
VALUES
(
'#i.barcode#',
'#i.lat#',
'#i.long#',
'#i.time#'
)
</cfquery>
</cfloop>
您需要去掉 "batch=" 或将整个内容传递给 "evaluate()",这会将数组文字设置为名为 batch 的变量。我会推荐前一个选项,因为第二个选项可能会被字符串中的恶意 CFML 内容利用。
<cfset arrayOfStructs = deserializeJson( replaceNoCase( decodedBody, "batch=", "" ) )>
在我看来,您可以作为表单范围的一部分直接访问 "batch" 的值。当然,假设您确实收到了 post 请求。
所以你可以这样做:
<cfif isDefined("form.batch")>
<cfset aData = deSerializeJSON(trim(form.batch))>
<cfdump var="#aData#">
</cfif>
因此无需查看请求正文,也无需解码响应。
我正在为我的业务测试一个名为条码扫描仪终端的应用程序;我想用它来代替时钟。
员工可以扫描他们 ID 徽章上的条形码或二维码,此应用会将其连同时间戳甚至 GPS 坐标一起发送到我的服务器,以验证他们是否在正确的时间出现在正确的地点.当 phone 连接到 Internet 时,此信息将通过我网站上的特殊 URL 传递,我可以使其完美运行。
问题是什么?
当没有互联网时,phone 将扫描结果存储在本地,您可以稍后将其发送到您的服务器。这些扫描存储为 JSON 结构数组。
According to the documentation
...以这种方式存储的数据可以作为 POST 请求发送到服务器。我不确定如何测试所有这些,所以我只是设置了一些变量,进行了扫描,然后收到一封电子邮件,其中转储了它们所代表的值。
<cfset requestBody = toString( getHttpRequestData().content )/>
退回了这个怪物和许多其他喜欢它的人;您在下面看到的是一次扫描。
batch=%5B%7B%22barcode%22%3A%22CSS1959%22%2C%22scannerID%22%3A%223e81b04aa521a05e%22%2C%22time%22%3A%222015-08-11+08%3A28%3A20.419%22%2C%22lat%22%3A32.3999433%2C%22long%22%3A-110.040379%7D%5D
所以我 运行 通过 URLDecode() 函数得到看起来更熟悉的东西。
<cfset decodedBody = #URLDecode(requestBody)#>
<!--- This would output the following. Line breaks are for ease of reading. --->
batch=[{"barcode":"CSS1959","scannerID":"3e81b04aa521a05e",
"time":"2015-08-11 08:28:20.419","lat":32.3999433,"long":-110.040379}]
所以最终我有一堆扫描在 JSON 中形成了这个结构数组,但我不知道如何处理它。
batch=[
{"barcode":"CSS1035","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:27.232","lat":32.4001579,"long":-110.0403455},
{"barcode":"CSS1959","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:29.366","lat":32.4001579,"long":-110.0403455},
{"barcode":"CSS1649","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:31.642","lat":32.4001579,"long":-110.0403455}
]
我正在尝试遍历它并将它们全部插入数据库。
到目前为止,我已经有了这个,但我遇到了一个 JSON 解析错误。
<cfset requestBody = toString( getHttpRequestData().content ) />
<cfset decodedBody = #URLDecode(requestBody)#>
<!---This is where I falter because I have no idea how to handle it.--->
<cfset arrayOfStructs = deserializeJson(decodedBody)>
<cfloop array="#arrayOfStructs#" index="barcode">
blah blah query logic
</cfloop>
这是我得到的错误。
谢谢!
编辑:解决部分感谢我在这里收到的帮助。解决方案如下:
<cfset requestBody = #replaceNoCase( toString(getHttpRequestData().content), "batch=", "" )# />
<cfset decodedBody = #URLDecode(requestBody)#>
<cfset ArrayOfStructs = deserializeJson(decodedBody)>
<cfloop array="#ArrayOfStructs#" index="i">
<cfquery name="doodoodoo" datasource="CRM">
INSERT INTO TimeAppTest
(
EmployeeID,
lat,
long,
TimoStampo
)
VALUES
(
'#i.barcode#',
'#i.lat#',
'#i.long#',
'#i.time#'
)
</cfquery>
</cfloop>
您需要去掉 "batch=" 或将整个内容传递给 "evaluate()",这会将数组文字设置为名为 batch 的变量。我会推荐前一个选项,因为第二个选项可能会被字符串中的恶意 CFML 内容利用。
<cfset arrayOfStructs = deserializeJson( replaceNoCase( decodedBody, "batch=", "" ) )>
在我看来,您可以作为表单范围的一部分直接访问 "batch" 的值。当然,假设您确实收到了 post 请求。
所以你可以这样做:
<cfif isDefined("form.batch")>
<cfset aData = deSerializeJSON(trim(form.batch))>
<cfdump var="#aData#">
</cfif>
因此无需查看请求正文,也无需解码响应。