我已经在 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"}'
有一些警告。
我从中提取的 JSON 应用程序需要返回这些字段,无论是否为空:loginHosts、sudoHosts、CPG、mail、loginShell。如果他们没有被退回,应用程序会抱怨。
JSON 应用程序期望 loginHosts、sudoHosts 和 CPG 作为数组 [] 返回,即使为 null。即:'{"loginHosts":[],"sudoHosts":[]}'
原始 loginHosts 和 sudoHosts 数据(例如:server1.example.com、server2.example.com)必须保留在发送回应用程序的 JSON 字符串中。所以我所有的新数据都必须附加。
很多时候 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 提交数据。是的,令人费解,但由于安全原因,这是我所拥有的。