首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JSON数组ColdFusion中追加到JSON数组

在JSON数组ColdFusion中追加到JSON数组
EN

Stack Overflow用户
提问于 2016-06-17 16:16:44
回答 1查看 1.2K关注 0票数 3

以下是后续问题:用ColdFusion附加到JSON数组中,考虑到Null值?

这个问题昨天被回答了,效果很好(谢谢凯文·B.和利!)但是,我正在从其中提取JSON数据的应用程序今天早上抛出了一个曲线球。有时是,根据我请求的数据,它将整个JSON作为数组返回如下所示:

代码语言:javascript
运行
复制
[
   {
      "loginHosts": [
         "server1.example.com"
      ],
      "sudoHosts": [
         "server1.example.com"
      ],
      "CPG": [
         "my_group"
      ],
      "mail": "myuser@example.com",
      "loginShell": "/bin/bash"
   }
]

我不知道为什么那个应用程序会这么做。如果我知道这是可能的话,我会把这些信息添加到我之前的问题中,我很抱歉。

我试图找到一个解决方案,这使我首先来到这里:使用冷融合的JSON数据。将JSON数组作为集合循环似乎是可行的,但只有当数组值中没有一个是Null时才能工作。我认为使用这段代码,就像在前面的问题中一样,如果我将它用于所有的JSON字段,它就会起作用:

代码语言:javascript
运行
复制
<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()类似于evaluate(),不推荐使用。

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

-编辑--

我看到了一个帖子:ColdFusion JSON对象与对象数组。我注意到问题中的JSON是一个数组[],我将答案应用于我的代码,但仍然遇到了Null问题。我想我不知道如何检查嵌套的Null值。:(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-17 17:24:32

一步一步地走。

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

如果由于某种原因,API确实没有正当理由返回不同的结果,那么您可以做的最好就是根据您期望的内容编写代码,并在收到其他内容时优雅地失败。首先列出预期的可能性:

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

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

代码语言:javascript
运行
复制
<cfset data = deserializeJson(originalJSON)>
....
<!--- Extract structure from first element of array --->
<cfif IsArray(data) && arrayLen(data)>
    <cfset data = data[1]>
</cfif>

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

代码语言:javascript
运行
复制
<!--- 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是正确的,那么您所能做的就是为预期的代码编写代码,并在发生不同的事情时优雅地失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37886107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档