1

我已经在 Stack 上挖掘了一段时间,但我不相信我的大脑得到了如何做到这一点的提示。

我需要这个 JSON:

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

看起来像这样的 JSON:

'{"loginHosts":["server1.example.com","server2.example.com","newserver1.example.com","newserver2.example.com"],"sudoHosts":["server1.example.com","server2.example.com","newserver1.example.com","newserver2.example.com"],"CPG":"my_group","mail":"test@example.com","loginShell":"/bin/bash"}'

有一些警告。

  1. 我从中提取的 JSON 应用程序需要返回这些字段,无论是否为空:loginHosts、sudoHosts、CPG、mail、loginShell。如果他们没有被退回,应用程序会抱怨。

  2. JSON 应用程序期望 loginHosts、sudoHosts 和 CPG 作为数组 [] 返回,即使为 null。即:'{"loginHosts":[],"sudoHosts":[]}'

  3. 原始 loginHosts 和 sudoHosts 数据(例如:server1.example.com、server2.example.com)必须保留在发送回应用程序的 JSON 字符串中。所以我所有的新数据都必须附加。

  4. 很多时候 loginHosts 和 sudoHosts 作为 Null 数组发送到我的应用程序。即:'{"loginHosts":[],"sudoHosts":[]}'

我正在使用 Linux 操作系统运行 Lucee 4.5 的服务器上开发它。获取/设置 JSON 字符串;我使用 CFEXECUTE ssh 到远程 Linux 服务器来拉/推我的 JSON 字符串。您可以在这里看到原因:Populating SELECT with large JSON data set via ColdFusion (Lucee) very slow

我到目前为止的代码:

    <cfset user_list = '{"loginHosts":["server1.example.com","server2.example.com"],"sudoHosts":["server1.example.com","server2.example.com"],"CPG":"my_group","mail":"test@example.com","loginShell":"/bin/bash"}'

<cfset arrayOfStructs = deserializeJson(user_list)>

<cfloop array="#arrayOfStructs#" index="user">
    <cfif structKeyExists(user, "loginHosts")>
        <cfloop array="#user.loginHosts#" index="login">
                <cfset loginHosts = #login#>
        </cfloop>
    </cfif>
    <cfif structKeyExists(user, "sudoHosts")>
        <cfloop array="#user.sudoHosts#" index="hosts">
            <cfset sudoHosts = #hosts#>
        </cfloop>
    </cfif>                             
    <cfif structKeyExists(user, "CPG")>
        <cfloop array="#user.CPG#" index="cp">
            <cfset CPG = #cp#>
        </cfloop>
    </cfif>
    <cfset mail = #user.mail#>
    <cfset loginShell = #user.loginShell#>
</cfloop>
<cfset my_servers = "newserver1.example.com,newserver2.example.com">
<cfset loginHosts = listAppend(loginHosts, "#my_servers#", ",")>
<cfset myStruct = '{"loginHosts":["#loginHosts#"],"sudoHosts":["#sudoHosts#"],"CPG":["#cp#"],"mail":"#mail#","loginShell":"#loginShell#"}'/>

然后使用我前面提到的 CFEXECUTE 方法对 myStruct 进行序列化并发送回远程服务器。

该代码有点作用,但有两件事不起作用。首先,每个 cfset loginHosts 和 cfset sudoHosts 只返回 JSON 中的第二个服务器 (server2.example.com)。我知道我在那个 CFLOOP 中覆盖了我自己的 loginHosts,但我不确定如何更正它并检查 loginHosts 数组是否为 Null。

我也有保留双引号的问题,以便它们保留在 JSON 中。在我的测试中,我得到了这个:

["server1.example.com","server2.example.com","newserver1.example.com,newserver2.example.com"]

注意到 newserver1 和 newserver2 之间缺少“,”了吗?

我尝试将转义引号添加到我的 listAppend() 中,如下所示:“”“#my_servers”“”。在我在 JSON 字符串中返回 Null 值之前,它似乎工作正常。

任何朝着正确方向的轻推将不胜感激!

编辑 - -

一些澄清:

原因:我只是想将其他服务器名称添加到数据库中。要使用该数据库,我需要使用发送 JSON 并期望返回 JSON 的 API。这必须通过使用 curl 的 BASH shell 脚本来完成。正如我在上面发布的,这就是原因:Populating SELECT with large JSON data set via ColdFusion (Lucee) very slow

我在我的应用程序中经常使用 serializeJSON() 和 deserializeJSON()。我的代码顶部的“user_list”只是为了向您展示我可以使用哪些数据。它不是手写的。

编辑2——

我很抱歉没有将此行添加到我上面的代码中。

底部的“myStruct”由“arrayOfStructs”中的数据填充,然后序列化。

<cfset myJsonvar = serializeJSON(myStruct)/>

然后,“myJsonvar”作为字符串通过 SSH 使用 CFEXECUTE 发送到 BASH 脚本,然后使用 curl 提交数据。是的,令人费解,但由于安全原因,这是我所拥有的。

4

1 回答 1

3

我会简化代码。似乎您所做的只是将两个新服务器添加到结构中现有的 loginHosts 列表中;这不需要任何循环。

<cfset user_list = '{"loginHosts":["server1.example.com","server2.example.com"],"sudoHosts":["server1.example.com","server2.example.com"],"CPG":"my_group","mail":"test@example.com","loginShell":"/bin/bash"}'>

<cfset myStruct = deserializeJson(user_list)>

<cfset myServers = ["newserver1.example.com","newserver2.example.com"]>

<!--- if loginHosts isn't an array, make it one. --->
<cfif NOT structKeyExists(myStruct, 'loginHosts') OR NOT isArray(myStruct.loginHosts)> 
  <cfset myStruct.loginHosts = []>
</cfif>
<cfset arrayAppend(myStruct.loginHosts, myServers, true)>

<cfset user_list = serializeJSON(myStruct)>
<!--- now user_list is a json string with your new servers added as login hosts, the rest of the struct remains the same. --->
于 2016-06-16T22:33:28.890 回答