serializeJSON() でシリアライズしている JSON 文字列があり、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 サーバーです。
Adobe から: useCustomSerializer true/false。customSerializer を使用するかどうか。デフォルト値は true です。カスタム シリアライザーは常に逆シリアル化に使用されます。false の場合、ColdFusion のデフォルトの動作を使用して JSON デシリアライズが実行されます。
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))>
これは現在機能しています...もっと良い方法はありますか?