arrays - 附加到 JSON 数组中的 JSON 数组 ColdFusion

标签 arrays json coldfusion lucee

这是以下问题的后续问题:Append to JSON array with ColdFusion, taking Null values into consideration?

这个问题昨天得到了回答,效果非常好(谢谢 Kevin B. 和 Leigh!)。然而,今天早上我从中提取 JSON 数据的应用程序给我带来了麻烦。 有时,根据我请求的数据,它会以数组形式返回整个 JSON,如下所示:

[
   {
      "loginHosts": [
         "server1.example.com"
      ],
      "sudoHosts": [
         "server1.example.com"
      ],
      "CPG": [
         "my_group"
      ],
      "mail": "myuser@example.com",
      "loginShell": "/bin/bash"
   }
]

我不知道为什么该应用程序会这样做。如果我知道有这种可能性,我会将该信息添加到我之前的问题中,我很抱歉。

我尝试寻找解决方案,首先将我带到这里:Using JSON Data with Coldfusion 。将 JSON 数组作为集合循环似乎可以工作,但前提是所有数组值都不为 Null。我认为如果我将这段代码用于所有 JSON 字段,就像上一个问题一样,它会起作用:

<cfif NOT structKeyExists(myStruct, 'sudoHosts') OR NOT isArray(myStruct.sudoHosts)> 
  <cfset myStruct.sudoHosts = []>
</cfif>

事实并非如此。我不断得到:

Error: Can't cast Complex Object Type Array to String

查看调试输出,Lucee 确实抛出了这个:string 使用内置函数“serialize(Array):String”从 Array 创建字符串。我做了更多挖掘,发现了这篇文章:Railo tip: store complex data by using serialize(data) 。可悲的是,空值再次袭来。另外,我的理解是 serialize()evaluate() 类似,不推荐。

我将继续寻找解决方案,但一如既往,我们非常感谢任何帮助!

--编辑--

我遇到了这个帖子:ColdFusion JSON object vs array of objects 。我注意到问题中的 JSON 是一个 ARRAY [],并且我将答案应用于我的代码,但仍然遇到 Null 问题。我想我不知道如何检查嵌套的空值。 :(

最佳答案

一步一步来。

理想情况下,您应该确定响应不同的原因。既然您说这些差异通常对应于您的请求中的不同内容,那么这强烈表明您可能忽略(或可能误解)远程 API 中的某些内容。我建议重新审查 API 来识别“某些东西”,以便找出正确的方法。否则,当您继续调整代码以处理每个"new"情况时,代码将很快变得难以管理且效率低下。

如果由于某种原因,API 确实在没有正当理由的情况下返回不同的结果,那么您能做的最好的事情就是根据您期望进行编码,并在以下情况下优雅地失败:你收到别的东西。首先列出预期的可能性:

  1. 响应是包含某些键的单个结构或
  2. 响应是包含某些键的结构数组

根据上述,您可以使用IsArrayIsStruct函数来确定响应的格式,并进行相应的处理。首先检查反序列化的对象。如果是数组,则提取第一个元素中的结构(注意,我假设数组仅包含单个元素,如示例所示。如果它可以包含多个元素,则需要额外处理).

<cfset data = deserializeJson(originalJSON)>
....
<!--- Extract structure from first element of array --->
<cfif IsArray(data) && arrayLen(data)>
    <cfset data = data[1]>
</cfif>

接下来验证您现在正在使用包含预期 key 的结构。如果是这样,请继续进行常规处理。否则,会发生意外情况,代码应执行适当的错误处理。

<!--- Verify object is a structure and contains expected key(s) --->
<cfif IsStruct(data) && structKeyExists(data, "loginHosts")>
    ... process data as usual
<cfelse>
    ... data is not in expected format, do  error handling here
</cfif>

上面是一个非常快速但肮脏的示例,但应该演示基本思想。只要您确定正确使用 API,您所能做的就是按预期编写代码,并在发生不同情况时优雅地失败。

关于arrays - 附加到 JSON 数组中的 JSON 数组 ColdFusion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886107/

相关文章:

arrays - 搜索数组元素并返回元素但保留原始类

.net - 如何使用 RestSharp 发布原始 Json?

jquery - 显示来自 REST GET 响应的 HTML 页面

c - 检查指针是否在指针数组的索引中

c - C 中没有索引的数组的引用

python - 从 Django Rest Framework 中的 Json 字符串中删除反斜杠

charts - ZingChart - 更改 ValueBox 的属性

coldfusion - 无故障 ColdFusion 应用程序更新过程

coldfusion - 谷歌 oauth token 给出 405 错误

javascript - 数组移出和插入时产生无限循环