这是以下问题的后续问题: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 确实在没有正当理由的情况下返回不同的结果,那么您能做的最好的事情就是根据您期望进行编码,并在以下情况下优雅地失败:你收到别的东西。首先列出预期的可能性:
- 响应是包含某些键的单个结构或
- 响应是包含某些键的结构数组
根据上述,您可以使用IsArray和 IsStruct函数来确定响应的格式,并进行相应的处理。首先检查反序列化的对象。如果是数组,则提取第一个元素中的结构(注意,我假设数组仅包含单个元素,如示例所示。如果它可以包含多个元素,则需要额外处理).
<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/