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

时间:2016-06-17 16:16:44

标签: 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>

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

  

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

通过调试输出,Lucee确实抛出了这个:string Use Built-In-Function "serialize(Array):String" to create a String from Array。我做了更多挖掘,发现了这篇文章:Railo tip: store complex data by using serialize(data)。可悲的是,Null的价值再次出现。此外,我的理解是serialize()evaluate()类似,不推荐使用。

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

- 编辑 -

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

1 个答案:

答案 0 :(得分:1)

一步一步。

理想情况下,您应该确定为什么响应不同。由于您说这些差异通常与您的请求中的不同内容相对应,因此强烈建议您可能忽略(或可能误解)远程API中的某些内容。我建议重新审核API以识别&#34;某些&#34;,以便找出正确的方法。否则,代码将很快变得无法管理且效率低下,因为您继续调整它以处理每个&#34; new&#34;情况。

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

  1. 响应是包含某些键的单个结构或
  2. Response是一个包含某些键的结构数组
  3. 基于以上所述,您可以使用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​​,您所能做的就是编写预期的代码,并在发生不同情况时优雅地失败。