1

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))>

これは現在機能しています...もっと良い方法はありますか?

4

0 に答える 0