2017-02-07 5 views
1

Ich versuche, eine vorhandene CF8-Anwendung zu aktualisieren, um ein Array mit den Ergebnissen einer neu aktualisierten RESTful-API-Antwort mithilfe von OData zu laden und zu laden.ColdFusion 8: OData-Antwort in Array konvertieren

Hier ist der Code in Frage ist ... Nachdem die Daten aus der API ziehen, die mit dem OData JSON-String reagiert, bläst der Code auf der letzten Zeile nach oben, dass die Schleife Dieses

<!--- Returned data is in json format so must change to an array. ---> 
<cfset local.result = deserializeJSON(myResult)> 

<!--- Reference the array collection of categories ---> 
<cfset local.collection = local.result> 

<!--- Initialize the output object ---> 
<cfset local.output = arrayNew(1)> 

<!--- Loop over the collection ---> 
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex"> 
... 

INiTS funktionierte gut mit der vorherige JSON-Antwort:

[ 
    { 
    "id": 1, 
    "name": "Blah, blah", 
    } 
] 

die einzige eingeführte Änderung ist die aktualisierte JSON Antwort:

[ 
    { 
    "@odata.context": "string", 
    "value": [ 
     { 
     "id": 1, 
     "name": "Blah, blah" 
     } 
    ] 
    } 
] 

Ich bin sicher, ich vermisse etwas Grundlegendes, aber ich habe noch nie an CF gearbeitet, also ist es Neuland hier.

Gedanken?

Danke!

UPDATE: Entschuldigung, nicht mehr Details zur Verfügung stellen. Hier ist, wie die App derzeit die Antwort verwendet:

<!--- Loop over the collection ---> 
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex"> 

    <!--- Create a reference to the array element ---> 
    <cfset local.objectInstance = local.collection[local.arrayIndex]> 

    <!--- Create a new object reference ---> 
    <cfset local.thisObject = structNew()> 

    <!--- Seed the object properties ---> 
    <cfset local.thisObject.categoryId = local.objectInstance.id> 
    <cfset local.thisObject.categoryName = local.objectInstance.name> 

    <!--- Place the new object in the collection array ---> 
    <cfset arrayAppend(local.output, duplicate(local.thisObject))> 

</cfloop> 

Und hier ist der Fehler Ich erhalte:

Error Occurred While Processing Request 
Object of type class coldfusion.runtime.Struct cannot be used as an array 

The error occurred in <path to file> line 97 

"Linie 97", die beginnen wird Schleife in dem Update oben:

Ich habe versucht, den von Miguel angebotenen "newJSON" -Ansatz zu benutzen (vielen Dank dafür!), Aber leider renne ich in den gleichen Fehler.

Danke nochmal! -Rich

+0

FWIW, arbeitet die oben [fein mit CF10] (http://trycf.com/gist/fc4a542847ab47be6f8362539488924a/acf2016?theme=monokai). (Obwohl CF8 möglicherweise nicht die gleiche Funktionalität hat). * RE: explodiert in der letzten Zeile * Blows wie? Erhalten Sie einen Fehler? Wenn ja, können Sie [Ihre Frage bearbeiten] (http://stackoverflow.com/posts/42102210/edit) hinzufügen? – Leigh

+0

Danke, @Leigh! Es ist eine dieser Situationen, in denen ich keine Kontrolle über die Architektur habe und es in den nächsten Jahren zu einem völligen Umschreiben kommt. Ich besitze die API, die die neuen Daten ausstellt, und übernahm die Rolle "Support", um die Clients zu aktualisieren ... dies ist der letzte. Ich habe meinen ersten Eintrag mit dem Fehler aktualisiert, den ich fangen kann, HTH! – richwallace

+0

Ich stimme Miguel-F zu, Sie müssen etwas anderes machen oder der Fehler wird durch etwas anderen Code verursacht. Wenn Sie das cfloop zu meinem vorherigen Beispiel hinzufügen, löst es einen Fehler in * local.objectInstance * aus, da dieses Objekt ein Array und keine Struktur ist. Sie erhalten also einen Fehler, weil * local.objectInstance.id * nicht existiert. Versuchen Sie sein aktuelles Beispiel. – Leigh

Antwort

2

Update nach Benutzer geschrieben Weitere Informationen

Wenn Sie noch einen Fehler immer dann hast du etwas falsch gemacht. Sie müssen die Art ändern, in der Sie auf das neue JSON-Datenobjekt verweisen. Ich habe einen neuen Gist mit dem aktualisierten Code erstellt, den Sie geliefert haben, damit Sie sehen können, wie es funktioniert - TryCF Gist 2

Grundsätzlich muss der Code innerhalb Ihrer <cfloop> so aussehen. Beachten Sie wieder, dass es tatsächlich zwei <cfloop> Blöcke gibt. Dies liegt daran, dass das neue JSON-Format ein Array generiert, das ein anderes Array enthält.

<!--- Loop over the collection ---> 
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex"> 

    <cfloop from="1" to="#arrayLen(local.collection[local.arrayIndex].value)#" index="local.arrayIndex2"> 

     <!--- Create a reference to the array element ---> 
     <cfset local.objectInstance = local.collection[local.arrayIndex].value> 

     <!--- Create a new object reference ---> 
     <cfset local.thisObject = structNew()> 

     <!--- Seed the object properties ---> 
     <cfset local.thisObject.categoryId = local.objectInstance[local.arrayIndex2].id> 
     <cfset local.thisObject.categoryName = local.objectInstance[local.arrayIndex2].name> 

     <!--- Place the new object in the collection array ---> 
     <cfset arrayAppend(local.output, duplicate(local.thisObject))> 

    </cfloop> 

</cfloop> 

Siehe Gist für mehr Details, aber diese weist den local.output Array, wie es vorher war. In Ihrem ursprünglichen Code war die local.objectInstance innerhalb der Schleife eine Struktur. Mit dem neuen JSON-Format enthält die local.objectInstance innerhalb der Schleife jetzt ein Array von Strukturen. Du musst es also als solches bezeichnen.

enter image description here

Original-Antwort, bevor Frage wurde aktualisiert

Mit dem aktualisierten JSON müssen Sie aktualisieren, wie Sie Ihren Code, um die Daten verweist (die Sie nicht in Ihrer ursprünglichen Nachricht enthalten waren). Indem ich einige Annahmen mache, kann ich Ihnen anhand der Beispiele, die Sie angegeben haben, zeigen, wie Sie die Daten referenzieren.

Zuerst für Ihr ursprüngliches Beispiel. Hier ist ein Code, der die Daten für Sie referenzieren und ausgeben würde. Beachten Sie, dass ich ein <cfdump> Tag eingefügt habe. Sie möchten das in Situationen wie diesem verwenden, wo Sie die Daten benötigen. Die deserializeJSON()-Funktion analysiert den JSON für Sie und erstellt ein ColdFusion-Array mit Strukturen.

<cfset oldJSON = '[ { "id": 1, "name": "Blah, blah" } ]'> 

<!--- Returned data is in json format so must change to an array. ---> 
<cfset local.result = deserializeJSON(oldJSON)> 

<!--- Reference the array collection of categories ---> 
<cfset local.collection = local.result> 

<!--- Initialize the output object ---> 
<cfset local.output = arrayNew(1)> 

<cfdump var="#local.result#" label="Old JSON"> 

<!--- Loop over the collection ---> 
<cfoutput> 
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex"> 
    <p>#local.arrayIndex# - #local.collection[local.arrayIndex].id# - #local.collection[local.arrayIndex].name#</p> 
</cfloop> 
</cfoutput> 

Dieser Code gibt die folgende Ausgabe:

enter image description here

Hier ist ein Beispiel für den aktualisierten Code benötigt, um die gleichen Werte aus dem neuen JSON-Format abgerufen werden. Beachten Sie, dass ich einen weiteren cfloop hinzugefügt habe, um auf die Daten zu verweisen, da es jetzt zwei Arrays gibt.

<cfset newJSON = '[ { "@odata.context": "string", "value": [ { "id": 1, "name": "Blah, blah" } ] } ]'> 
<!--- Returned data is in json format so must change to an array. ---> 
<cfset local.result = deserializeJSON(newJSON)> 

<!--- Reference the array collection of categories ---> 
<cfset local.collection = local.result> 

<!--- Initialize the output object ---> 
<cfset local.output = arrayNew(1)> 

<cfdump var="#local.result#" label="New JSON"> 

<!--- Loop over the collection ---> 
<cfoutput> 
<cfloop from="1" to="#arrayLen(local.collection)#" index="local.arrayIndex"> 
    <cfloop from="1" to="#arrayLen(local.collection[local.arrayIndex].value)#" index="local.arrayIndex2"> 
     <p>#local.arrayIndex# - #local.arrayIndex2# - #local.collection[local.arrayIndex].value[local.arrayIndex2].id# - #local.collection[local.arrayIndex].value[local.arrayIndex2].name#</p> 
    </cfloop> 
</cfloop> 
</cfoutput> 

Dieser Code gibt die folgende Ausgabe:

enter image description here

ich mit all diesen Code, um einen Kern erstellt, die Sie spielen, um kann - TryCF Gist 1

Verwandte Themen