ColdFusion 10 - Element [N] est indéfini dans un objet Java de la classe de type Coldfusion.Runtime.array

StackOverflow https://stackoverflow.com//questions/23062450

  •  26-12-2019
  •  | 
  •  

Question

J'ai récemment mis à niveau un système de CF8 en CF10 et avez un bug que j'ai des problèmes de suivi. Cela concerne un appel API distant qui obtient une chaîne JSON et cette chaîne est ensuite convertie en un objet de requête. C'est là que je rencontre l'erreur:

élément [n] est indéfini dans un objet Java de type classe Coldfusion.Runtime.array. Le problème est dans la fonction qui convertit la chaîne en une requête.

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

partout où le Json retourne 'null' (c'est-à-dire "...", "19107-3609", NULL, NULL, NULL, "...") L'erreur est lancée. J'ai essayé d'utiliser Isnull pour vérifier si c'est NULL dans la CLASC:

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

EDIT - Voici un exemple simplifié - Le problème est la façon dont les nouveaux œuvres desérialiszejson (), je crois:

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

J'ai essayé toutes sortes de tests pour la chaîne vide, Isnull, etc. Et je ne sais toujours pas comment obtenir l'objet de requête construit si DESERIALIZONJSON Retourne:

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

Cela semble fonctionner:

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

Cela me permet ensuite d'utiliser qrydata comme s'il s'agissait d'une cfquerie normale.

Était-ce utile?

La solution 2

Qu'est-ce que j'ai fait pour l'instant est d'ajouter 'False' au drapeau StrictMapping DeSérialiszejson et qui semble créer automatiquement un objet de requête?Je vais admettre que cela entrave les fondements de CF10 et je pourrais me tromper.Je mettrai à jour mon code ci-dessus pour la clarté visuelle.

Autres conseils

Vous pouvez faire une vérification si l'élément est indéfini à l'aide de la fonction CF Arrayisdefinefin (Array, Elementindex)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top