Coldfusion 10 - Element类[coldfusion.runtime.Array]类型的Java对象中未定义Element [n]

时间:2014-04-14 14:14:56

标签: coldfusion coldfusion-10

我最近将系统从CF8升级到CF10,并且有一个我在跟踪时遇到问题的错误。它与远程API调用有关,它返回一个JSON字符串,然后该字符串被转换为查询对象。这就是我遇到错误的地方:

在类coldfusion.runtime.Array类型的Java对象中未定义Element [n]。问题出在将字符串转换为查询的函数中。

<cffunction name="CFjsonToQuery" access="public" returntype="query" output="no">
  <cfargument name="cfData" required="yes" type="struct"/>
  <cfset var LOCAL = {}/>
    <cfset LOCAL.tmpQry = QueryNew( ArrayToList(ARGUMENTS.cfData.Data.COLUMNS) ) />
       <cfloop index = "i" from = "1" to = "#ArrayLen(ARGUMENTS.cfData.Data.DATA)#">
         <cfset LOCAL.Row = QueryAddRow(LOCAL.tmpQry) />
           <cfloop index="k" from="1" to="#ArrayLen(ARGUMENTS.cfData.Data.DATA[i])#">
             <cfset LOCAL.colName = ARGUMENTS.cfData.Data.COLUMNS[K]/>
             <cfset QuerySetCell(LOCAL.tmpQry,LOCAL.colName,ARGUMENTS.cfData.Data.DATA[i][k],LOCAL.Row)/>
           </cfloop>    
       </cfloop>
  <cfreturn LOCAL.tmpQry/>
</cffunction>    

JSON返回的任何地方&#39; null&#39; (即&#34; ...&#34;,&#34; 19107-3609&#34;,null,null,null,&#34; ...&#34;)抛出错误。我尝试使用isNull来检查它在cfloop中是否为null:

<cfif isNull(ARGUMENTS.cfData.Data.DATA[i][k])>
   <cfset ARGUMENTS.cfData.Data.DATA[i][k] = 'I AM NULL'/>
</cfif>

编辑 - 这是一个简单的例子 - 问题是新的deserializeJson()的工作方式我相信:

<cfset jstr = '{"SUCCESS":true,"ERRORS":[],"DATA":{"COLUMNS":["ID","FNAME","LNAME"],"DATA":[[390132,"steve",null]]}}'/>
<cfset cfData = deserializeJson(jstr) />
  <cfloop index = "i" from = "1" to = "#ArrayLen(cfData.Data.DATA)#">
    <cfset Row = QueryAddRow(tmpQry) />
      <cfloop index="k" from="1" to="#ArrayLen(cfData.Data.DATA[i])#">
        <cfset colName = cfData.Data.COLUMNS[K]/>
        <cfset QuerySetCell(tmpQry,colName,cfData.Data.DATA[i][k],Row)/>
      </cfloop>
  </cfloop>

我已尝试过对空字符串,isNull等进行各种测试。如果deserializejson返回,我仍然不确定如何构建查询对象:

[undefined array element] Element 3 is undefined in a Java object of type class coldfusion.runtime.Array.

这似乎有效:

<cfset cfData = deserializeJson(returnData,'FALSE') />
<cfset qryData = cfData.data />

这让我可以使用qryData,就像它是一个普通的cfquery一样。

1 个答案:

答案 0 :(得分:1)

我现在所做的就是添加“FALSE&#39;到deserializeJSON strictMapping标志,似乎自动创建一个查询对象?我承认,虽然这是进入CF10的基础,但我可能错了。为了清晰起见,我会更新上面的代码。