【问题标题】:JSON / CFML - Looping over an array of structsJSON / CFML - 遍历结构数组
【发布时间】:2015-08-12 23:24:01
【问题描述】:

我正在为我的企业测试一款名为 Barcode Scanner Terminal 的应用;我希望将其用作时钟的替代品。

员工可以扫描他们身份证上的条形码或二维码,这个应用程序会将其连同时间戳甚至 GPS 坐标一起发送到我的服务器,以验证他们是否在正确的时间出现在正确的地点。当手机有互联网连接时,这些信息会通过我网站上的一个特殊 URL 传递,我可以让它完美运行。

问题?

当没有互联网时,手机会将扫描结果存储在本地,您可以稍后将其发送到您的服务器。这些扫描存储为 JSON 结构数组。

According to the documentation

...以这种方式存储的数据可以作为 POST 请求发送到服务器。我不确定如何测试所有这些,所以我只是设置了一些变量,进行了扫描,然后向我发送了一封电子邮件,其中转储了它们所代表的值。

<cfset requestBody = toString( getHttpRequestData().content )/>

返回这个怪物和许多其他喜欢它的人;您在下面看到的是一次扫描。

批次=%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>

【问题讨论】:

  • 请注意,尽管有这篇文章的标题,但这与循环任何内容无关,而是解析 JSON 字符串。事实上,整篇文章本来可以只剩下解码后的 JSON 字符串和一个询问如何反序列化它的句子。
  • 我想我可能会混淆一些人。事实是我对 JSON 没有太多经验,我想我可以把它变成一个查询对象或其他东西。一直在学习!
  • 从技术上讲,您可以将其转换为查询,但实际上没有必要。你的第一直觉是正确的。只需将其反序列化为数组和结构。然后循环遍历数组。不需要查询对象。

标签: android arrays json coldfusion cfml


【解决方案1】:

在我看来,您可以直接访问“batch”的值作为表单范围的一部分。当然,假设您确实收到了一个发布请求。

所以你可以这样做:

<cfif isDefined("form.batch")>
    <cfset aData = deSerializeJSON(trim(form.batch))>
    <cfdump var="#aData#">
</cfif>

因此无需查看请求正文,也无需解码响应。

【讨论】:

  • 我最后写了一些东西来适应布拉德伍德的回应(他只是第一个回答),但这也很有效,而且因为简单而加分!
【解决方案2】:

你要么需要去掉“batch=”,要么将整个东西传递给“evaluate()”,这会将数组文字设置为一个名为batch的变量。我会推荐前一个选项,因为第二个可能会被字符串中的恶意 CFML 内容利用。

<cfset arrayOfStructs = deserializeJson( replaceNoCase( decodedBody, "batch=", "" ) )>

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2011-02-05
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多