使用 Coldfusion 手动 JSON 数组 - 在我替换为动态值之前一直有效

问题描述

由于我无法控制的原因,我需要手动创建一个 JSON 结构来发布到 API。我已经这样做了如下;

<cfsavecontent variable="JSONData">
{"data":[{"Last_Name":"#lastname#","First_Name":"#firstname#","$gclid":"#zc_gad#","Email":"#email#","Phone":"#phonenumber#","Lead_Source":"PPC","Build_Cost_text":"#buildcost#","Estimated_Sales_Value_text":"#estsalesvalue#","Stage_of_Build_Work":"#stageofbuildingwork#","Work_Starting_Date_text":"#workstartdate#","No_Of_Units_text":"#numofunits#","Address_of_Development":"#devaddress#","Do_you_require_a_quote_for_building_control1":"#bcquote#","Gross_Floor_Area_text":"#grossfloorarea#","Development_Use":"#devuse#","Please_share_any_additional_information":"#additionalinfo#","Product_Type":"Warranty","Company":"#company#"}]}
</cfsavecontent>

(实际代码没有换行符 - 只是有点难读!)

然后我用它来发布到 API;

<cfhttp method="POST" url="APIurl" result="postresult">
<cfhttpparam type="header" name="Authorization" value="oauthtokenvalue">
<cfhttpparam type="header" name="content-type" value="application/json" />
<cfhttpparam type="body" value="#JSONData#" />
</cfhttp>

如果不是用动态值填充它,例如“#lastname#”被硬编码为“Smith”,它工作得很好。

但是,一旦我添加了动态标签,就会出现以下错误

Can't cast Complex Object Type Struct to String

将 cfhttpparam(为了测试)更改为;

<cfhttpparam type="body" value="#SerializeJSON(JSONData)#" /> 

也没什么区别。

如果重要,上面是检索记录的 cfquery,然后将其包装在 cfoutput 查询中 - 除了动态引用之外,这是“工作”代码和非工作代码间的唯一区别代码

解决方法

SaveContent 将您输出的任何内容保存到一个字符串中。您显示的代码可能没有输出任何内容。相反,您可能正在创建一个结构体。为确保您输出的是 JSON,请添加如下标记:

<cfsavecontent variable="JSONData">
<cfoutput>
{"data":[{"Last_Name":"#lastname#","First_Name":"#firstname#",...
}]
}
</cfoutput>
</cfsavecontent>

但是,更好的方法是使用 SerializeJSON()。我想不出你不能使用它的原因。例如:

<cfscript>
myQuery = queryExecute(...);
myData = {
    "data": []
}
for (record in myQuery) {
    arrayAppend(myData.data,{
        "last_Name": record.lastName,"First_Name": record.firstName
        ...
    });
}
WriteOutput(SerializeJSON(myData));
</cfscript>

无论哪种方式,您都需要查看要调试的字符串,这应该能让您更好地了解问题所在。我会在您创建字符串后添加一个 <cfdump var="#jsonData#"> 以查看它的外观。您也可以输出 <pre>#EncodeForHTML(jsonData)#</pre><pre>#HTMLEditFormat(jsonData)#</pre> 来查看它。

但更大的问题是为什么您需要手动构建 json。我知道你说这是出于你无法控制的原因。也许您使用的是旧版本的 ColdFusion??无论您使用什么版本的 CFML,您仍然应该能够循环查询并将记录值的结构附加到数组,然后使用 SerializeJSON() 输出它们。如果您的问题是旧版本的 SerializeJSON() 有问题,那么有一些 UDF 可以解决 SerializeJSON() 的一些旧问题,或者您可以自己编写比构建字符串更好的方法。>