3

这是一个后续问题:使用 ColdFusion 附加到 JSON 数组,考虑 Null 值?

这个问题昨天得到了回答,而且效果很好(谢谢 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>

此情况并非如此。我不断得到:

错误:无法将复杂对象类型数组转换为字符串

查看调试输出,Lucee 确实抛出了这个:string Use Built-In-Function "serialize(Array):String" to create a String from Array. 我做了更多的挖掘,发现了这篇文章:Railo 提示:使用 serialize(data) 存储复杂数据。可悲的是,空值再次出现。另外,我的理解serialize()与 类似evaluate(),不推荐。

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

- 编辑 -

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

4

1 回答 1

1

一步一步来。

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

如果由于某种原因 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>

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

<!--- 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,您所能做的就是为预期编写代码,并在发生不同情况时优雅地失败。

于 2016-06-17T17:24:32.207 回答