2016-04-08 49 views
5

İşlevim SendGrid API'yi çağırır. Bir Array + yapısını döndürür. CFQuery veri kümesini döndürmek için bir işlev yazıyorum.Coldfusion: api çağrısında iç içe Döngü Array & Struct

Hedef İşlevime bir seri hale getirilmiş veri nesnesi iletmek ve bir sorgu veri kümesi almak istiyorum.

<cfparam name="variables.ddata" default="#structnew()#"> 
<!--- API Call Code here ---> 
<cfset arr = DESerializeJSON(returnStruct.Filecontent) /> 
<cfdump var="#arr#"> 

CFdump on call

Kodum:

<cfset arrayit(arrobj= arr) > 
<cfdump var="#variables.ddata#" > 
<cffunction name="arrayit" access="public" returntype="void"> 
    <cfargument name="arrobj" type="array" required="yes"> 
    <cfset var arr=arguments.arrobj /> 
    <cfloop from="1" to = "#arrayLen(arr)#" index="i"> 
     <cfif isValid("string", arr[i])> 
      <cfset StructInsert(variables.ddata, i, arr[i]) /> 
     </cfif> 
     <cfif isstruct(arr[i])> 
      <cfset structit(structobj = arr[i]) /> 
     </cfif> 
    </cfloop> 
</cffunction> 

<cffunction name="structit" access="public" returntype="void" output="yes"> 
    <cfargument name="structobj" type="any" required="yes"> 
    <cfset stru = arguments.structobj /> 
    <cfloop collection="#stru#" item="S"> 
     <cfif isValid("string", stru[S])> 
      <cfset StructInsert(variables.ddata, S, stru[S]) /> 
     </cfif> 
     <cfif isarray(stru[S])> 
      <cfset arrayit(arrobj = stru[S]) > 
     </cfif> 
    </cfloop> 
</cffunction> 

Sonuç:

Result

İşte

benim çalışma kodu ve çıkışı Benim işlevinde bu satırı eklediğinizde

<cfif isstruct(stru[S])> 
    <cfset variables.ddata = arrayit(arrobj = stru[S]) /> 
</cfif> 

bir hata oluşur:

Eleman tipi bir ifadesinin parçası olarak başvurulan bir CFML yapısında tanımlanmamış.
hata hattında meydana gelen 71.

** Tam Kod **

<cfsavecontent variable="returnStruct.Filecontent"> 
[{"date":"2016-04-05","stats":[{"type":"category","name":"5","metrics":{"blocks":1,"bounce_drops":0,"bounces":9,"clicks":4,"deferred":1,"delivered":1,"invalid_emails":8,"opens":4,"processed":1,"requests":1,"spam_report_drops":0,"spam_reports":1,"unique_clicks":3,"unique_opens":3,"unsubscribe_drops":0,"unsubscribes":9}}]}] 
</cfsavecontent> 

<cfset arr = DESerializeJSON(returnStruct.Filecontent) /> 

<cfloop from="1" to="#arrayLen(arr)#" index="i"> 
    <cfif isValid("string", arr[i])> 
     <cfset StructInsert(variables.ddata, i, arr[i],true) /> 
    </cfif> 

    <cfif isstruct(arr[i])> 
     <cfsavecontent variable="rr"> 
      <cfdump var="#arr[i]#" label="Line 48 ERROR" > 
     </cfsavecontent> 
     <cfset NotifyErrorAdmin(emailBody = "#rr#" ,emailsubject = "Line 48") /> 
     <cfset structit(structobj = arr[i]) /> 
    </cfif> 
     <cfif isarray(arr[i])> 
     <cfsavecontent variable="rr"> 
      <cfdump var="#arr[i]#" label="Line 54 ERROR" > 
     </cfsavecontent> 
     <cfset NotifyErrorAdmin(emailBody = "#rr#" ,emailsubject = "Line 54") /> 
     <cfset arrayit(arrobj = arr[i]) > 
    </cfif> 
</cfloop> 
</cffunction> 

<cffunction name  = "structit" access="public" returntype="void" output="yes"> 
<cfargument name  = "structobj" type="any" required="yes"> 
<cfset stru   = arguments.structobj /> 

<cfloop collection="#stru#" item="S"> 
    <cfif isValid("string", stru[S])> 
     <cfset StructInsert(variables.ddata, S, stru[S],true) /> 
    </cfif> 
    <cfif isarray(stru[S])> 
     <cfsavecontent variable="rr"> 
      <cfdump var="#stru[S]#" label="Line 86 ERROR" > 
     </cfsavecontent> 
     <cfset NotifyErrorAdmin(emailBody = "#rr#" ,emailsubject = "Line 87") /> 
     <cfset arrayit(arrobj = stru[S]) > 
    </cfif> 
<cfif isstruct(stru[S])> 
     <cfsavecontent variable="rr"> 
      <cfdump var="#stru[S]#" label="Line 97 ERROR" > 
     </cfsavecontent> 
     <cfset NotifyErrorAdmin(emailBody = "#rr#" ,emailsubject = "Line 97") /> 
     <cfset structit(structobj = stru[S]) /> 
    </cfif> 
</cfloop> 
</cffunction> 

ERRORSg3Sg4sg5sg1err

+0

Burada gösterilmeyen nedir 'arrayit' işlevi çağırıyorsunuz. Hatanızın bu işlevde olduğundan şüpheleniyorum. – beloitdavisja

+0

Teşekkürler Sadece Düzenlendi ... kodu vardı ama biçimlendirme nedeniyle belki de göstermiyordu .. –

cevap

1

Sadece yaptım! :) sadece projemizi sizlerle paylaşmak istedim siz de başkalarının da yardım edeceğini umuyoruz ...

İyileştirebileceğimi düşündüğünüz bir şey bulursanız lütfen paylaşın.

Özel Mesajımdaki yanıt için teşekkürler. & @Beginner @Leigh

API Çağrı Json Dönüş: 1

<cfsavecontent variable="returnStruct.Filecontent"> 
[{"date":"2016-04-05","stats":[{"type":"category","name":"5","metrics":{"blocks":1,"bounce_drops":0,"bounces":9,"clicks":4,"deferred":1,"delivered":1,"invalid_emails":8,"opens":4,"processed":1,"requests":1,"spam_report_drops":0,"spam_reports":1,"unique_clicks":3,"unique_opens":3,"unsubscribe_drops":0,"unsubscribes":9}}]}] 
</cfsavecontent> 

<cfset arr = DESerializeJSON(returnStruct.Filecontent) /> 

CFC: 2

<cfcomponent> 
<cfparam name="variables.qryclsvar" default="" type="any"/> 
<cfparam name="variables.qryclsvarfg" default="true" type="any"/> 

<cffunction name="APItoquery" access="public" returntype="any"> 
<cfargument name  = "APIobj"   type="any" required="yes"> 
<cfset var vAPIobj  = arguments.APIobj /> 
<cfset var APIDATA  = structnew() /> 
<cfset var APIDATAqr  = "" /> 
<cftry> 
    <cfloop from="1" to="#arrayLen(vAPIobj)#" index="jj"> 
     <cfif isarray(vAPIobj[jj])> 
      <cfset APIDATA = arrayit(structobj = vAPIobj[jj] ,datastruct = APIDATA) /> 
     </cfif> 
      <cfif isstruct(vAPIobj[jj])> 
      <cfset APIDATA = structit(structobj = vAPIobj[jj],datastruct = APIDATA) /> 
     </cfif> 

     <cfif NOT StructIsEmpty(APIDATA)> 
      <!--- Add in query object ---> 
      <cfset APIDATAqr = structtoquery(structobj= APIDATA) /> 
     <cfelse> 
      <cfset APIDATAqr ="NO Data Found!" /> 
     </cfif> 
    </cfloop> 

<cfcatch> 
    <cfdump var="#cfcatch#" label="APItoquery"> 
</cfcatch> 
</cftry> 
<cfreturn APIDATAqr> 
</cffunction> 



<cffunction name  = "arrayit"   access="public" returntype="any"> 
<cfargument name  = "arrobj"   type="any" required="yes"> 
<cfargument name  = "datastruct"  type="any" required="yes" > 
<cfset var arr   = arguments.arrobj /> 
<cfset var arrdata  = arguments.datastruct /> 
<cftry> 
<cfloop from="1" to="#arrayLen(arr)#" index="i"> 
     <cfif ArrayContains(arr, i) > 
      <cfset StructInsert(arrdata, i, arr[i],true) /> 

     </cfif> 
     <cfif isarray(arr[i])> 
      <cfset arrdata = arrayit(arrobj = arr[i] ,datastruct = arrdata) > 
     </cfif> 
     <cfif isstruct(arr[i]) > 
      <cfset stdata = structit(structobj = arr[i],datastruct = arrdata) /> 
     </cfif> 
</cfloop> 
<cfcatch> 
    <cfdump var="#cfcatch#" label="arrayit"> 
</cfcatch> 
</cftry> 
<cfreturn arrdata> 
</cffunction> 


<cffunction name  = "structit"   access="public" returntype="any" output="yes"> 
<cfargument name  = "structobj"   type="any" required="yes"> 
<cfargument name  = "datastruct"  type="any" required="yes"> 
<cfset var stru  = arguments.structobj /> 
<cfset var stdata  = arguments.datastruct /> 
<cftry> 
    <cfloop collection="#stru#" item="S"> 
     <cfif isarray(stru[S])> 
      <cfset stdata = arrayit(arrobj = stru[S] ,datastruct = stdata) > 
     <cfelseif isstruct(stru[S]) > 
      <cfset stdata = structit(structobj = stru[S],datastruct = stdata) /> 
     <cfelse> 
      <cfset StructInsert(stdata, S, stru[S],true) /> 

     </cfif> 
    </cfloop> 
<cfcatch> 
    <cfdump var="#cfcatch#" label="structit"> 
</cfcatch> 
</cftry> 
<cfreturn stdata> 
</cffunction> 

<cffunction name  = "structtoquery"    access="public" returntype="any" output="yes"> 
<cfargument name  = "structobj"    type="any" required="yes"> 
<cfset var vstructobj  = arguments.structobj /> 
<cfset var cols  = StructKeyList(vstructobj)> 
<cfset var colstyp = ""> 
     <cftry> 
      <cfif variables.qryclsvarfg EQ true> 
       <cfloop from="1" to="#listlen(cols,',')#" index="L"> 
        <cfset colstyp = ListAppend(colstyp,"VarChar",",")> 
       </cfloop> 
       <!--- Create a new query. ---> 
       <cfset variables.qryclsvar = queryNew(
             '#cols#', 
             '#colstyp#' 
             )> 
      <cfset variables.qryclsvarfg = false> 
      </cfif> 
      <cfset QueryAddRow(variables.qryclsvar, 1)> 
      <cfloop collection="#vstructobj#" item="sd"> 
       <cfset QuerySetCell(variables.qryclsvar, "#sd#", vstructobj[sd])> 
      </cfloop> 

     <cfcatch> 
      <cfdump var="#cfcatch#" label="structit"> 
     </cfcatch> 
     </cftry> 
<cfreturn variables.qryclsvar> 
</cffunction> 
</cfcomponent> 

CFM: 3

<cfset sgObj = createobject("component","cfc.mycfc") /> 
<cfset mystruct = sgObj.APItoquery(APIobj= arr1) > 
<cfdump var="#mystruct#" label="mystruct"> 

MA! ....

3

UDF arrayit öğeniz, array türünde bir bağımsız değişken kabul eder, ancak bu koşul doğru olduğunda struct iletilir. Bu durumda hata eklemiş daha farklı olacaktır,

<cfif isStruct(stru[S])> 
    <cfset variables.ddata = structit(structobj = stru[S])> 
</cfif> 

Ama: yani

<cfif isStruct(stru[S])> 

    <!--- This means stru[S] is a struct ---> 
    <cfset variables.ddata = arrayit(arrobj = stru[S])> 
    <!--- arrObj should be of type 'array' ---> 
</cfif> 

Yani, olmalıdır. anahtar varsa ve AllowOverwrite = "False" ise

, ColdFusion atar: Ayrıca

,

  • StructInsert() varsayılan false gereğidir ve dokümanlara göre isteğe bağlı bir argüman allowoverwrite alır istisnası.

+0

merhaba sen haklıydı typeo ama yazma argümanı üzerine ekledikten sonra hala hata alıyorum. Bu zaman hatası bit değişimi *** " ARR, " dizi değişkeni için boyut 1'deki konum 2'deki öğe bulunamıyor.
Hata 48 satırında gerçekleşti. *** satırı 48 '' –

+0

@knowledgeSeeker Bu hatayı sorgunuza daha ekleyin ve kaldırın yazım hataları. – Beginner

+0

Sadece düzenlenmiş tam kod ve hata ayıklama ekranları koyduğunuz için üzgünüm ... –