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

Manual JSON array with Coldfusion - works until I replace with Dynamic Values

由于我无法控制的原因,我需要手动创建一个 JSON 结构到 post 到一个 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>

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

然后我用它来 post 到 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 查询中 - 除了动态引用之外,这是 'working' 代码之间的唯一区别和非工作代码。

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() 的一些旧问题,或者您可以自己编写会比构建字符串更好。