1

我有一个 JSON 字符串,我正在使用 serializeJSON() 进行序列化,并且使用 cfhttp 获取它,但是当我使用 DeserializeJSON() 时,我抛出错误“JSON 解析失败:JSON 字符串意外结束”。

<cfdirectory directory = "#imagePath#\#getType#\new" action="list" name="getList">
<cfset getDATA = serializeJSON(getList)>

我已经验证了 JSON 字符串:

{"COLUMNS":["NAME","SIZE","TYPE","DATELASTMODIFIED","ATTRIBUTES","MODE","DIRECTORY","LINK"],"DATA":[["test.jpg",154227,"File","November, 22 2019 12:15:43","","","D:\\wwwroot\\images\\new",false]]} 

它在我尝试反序列化之前通过 IsJSON()。

<cfhttp method="get" username="#un#" password="#pw#" url="#brkrURL#" port="#brkrPORT#" result="brokerData">
<cfif IsJSON(brokerData.fileContent)>
   <cftry>
      <cfset getData = DeserializeJSON(brokerData.fileContent, false)>
      <cfdump var="#getData#">
      <cfcatch>
         <cfdump var="#brokerData.fileContent#">
         <cfdump var="#cfcatch#">
         <cfabort>                  
      </cfcatch>
   </cftry>
</cfif>

这在 CF10 中工作,但这是一个新的 CF18 服务器。

来自 Adob​​e:useCustomSerializer true/false。是否使用 customSerializer。默认值是true。自定义序列化程序将始终用于反序列化。如果为 false,则 JSON 反序列化将使用默认的 ColdFusion 行为完成。

由于 SerializeJSON 的默认值是“true”,因此我将 customSerializer 更改为“true”,这允许 JSON 被反序列化,但它返回一个 Struct(它用于返回查询)所以我添加了一个函数来放置结构成一个查询。

<!--- convert a Struct to a query --->
<cffunction name="structToQuery" access="public" output="true" returntype="query" hint="Changes a structure to a query.">
   <cfargument name="getStruct" type="struct" required="true" />                            
   <cfset getData = QueryNew("")>
   <cfloop from="1" to="#arrayLen(getStruct.columns)#" index="col">
      <cfset QueryAddColumn(getData, getStruct.columns[col], 'VarChar', ArrayNew(1)) />
   </cfloop>
   <cfloop from="1" to="#arrayLen(getStruct.data)#" index="row">
      <cfset temp = QueryAddRow(getData, 1)>
      <cfloop from="1" to="#arrayLen(getStruct.columns)#" index="col">
         <cfif arrayIsDefined(getStruct.data[row], col)>
            <cfset QuerySetCell(getDataJSON, getStruct.columns[col],getStruct.data[row][col]) />                        
         <cfelse>                       
            <cfset QuerySetCell(getDataJSON, getStruct.columns[col],'') />
         </cfif>
      </cfloop>
   </cfloop>        
   <cfreturn getData>
</cffunction>               
<cfset getData = structToQuery(DeserializeJSON(brokerData.fileContent, true))>

这现在正在工作......有更好的方法吗?

4

0 回答 0