2017-02-07 3 views
1

ODataを使用して新しく更新されたRESTful APIレスポンスの結果を使用して配列を消費しロードする既存のCF8アプリケーションを更新しようとしています。ColdFusion 8:ODataレスポンスをアレイに変換する

ここで問題のコードです... ODataのJSON文字列で応答APIからデータを引っ張った後、コードはこれがうまく働いていたループに

<!--- 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最後の行に吹きます

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

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

導入唯一の変更が更新JSONレスポンスです:前のJSONレスポンスを使用して

私は何か基本的なものが欠けていると確信していますが、私はCFでこれまでに作業したことがないので、ここは新しい領域です。

思考?

ありがとうございます!

更新日: 詳細についてはお答えできません。

:上記のアップデートで利用できるループを開始

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 

「ライン97」されています

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

そして、ここで私が受けてるのエラーです:ここではアプリは、現在の応答を使用してみましょう

私はMiguelが提供している "newJSON"アプローチを使用しようとしました。(ありがとうございました!)、残念ながら、私は同じエラーに遭遇しています。

もう一度おねがいします!あなたはまだ、あなたが何か間違ったことをしたエラーを取得している場合は、ユーザーの後 リッチ

+0

FWIW、上記〔と正常に動作しますCF10](http://trycf.com/gist/fc4a542847ab47be6f8362539488924a/acf2016?theme=monokai)。 (CF8はすべて同じ機能を持つわけではありませんが)。 * RE:最後の行で爆破する*爆破する方法は?エラーが発生していますか?はいの場合、それを含めるには[あなたの質問を編集する](http://stackoverflow.com/posts/42102210/edit)できますか? – Leigh

+0

ありがとう、@Leigh!それは、私がアーキテクチャを支配していない状況のうちの1つで、今後数年以内に全面的に書き直すのはうんざりです。私は新しいデータを公開しているAPIを所有しており、クライアントを更新するための "サポート"の役割を担っています。これが最後のものです。私は最初のエントリを私が捕まえることができるエラー、HTHで更新しました! – richwallace

+0

私はMiguel-Fに同意します。別の何かをしている必要があります。そうでないとエラーが若干異なるコードによって発生しています。前述の例にcfloopを追加すると、* local.objectInstance *にそのオブジェクトが構造体ではなく配列であるため、エラーがスローされます。 * local.objectInstance.id *が存在しないため、エラーが発生します。彼の更新例を試してみてください。 – Leigh

答えて

2

更新はより多くの情報

を掲載しました。新しいJSONデータオブジェクトを参照する方法を変更する必要があります。あなたが提供する更新されたコードを使用して新しいGistを作成しました。どのように動作するかを見ることができます。 - TryCF Gist 2

基本的に<cfloop>のコードはこのように見える必要があります。ここでも実際には2つの<cfloop>ブロックがあることに注意してください。これは、新しいJSON形式が別の配列を含む配列を生成するためです。

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

は詳細については要点を参照してください、それは前にあったように、これはlocal.output配列を割り当てます。元のコードでは、ループ内のlocal.objectInstanceは構造体でした。新しいJSON形式の場合、ループ内のlocal.objectInstanceに構造体の配列が含まれるようになりました。だからあなたはそのように参照する必要があります。

enter image description here

質問の前にオリジナルの答えはあなたのコードは、(あなたがあなたのオリジナルのポストに含まれていませんでした)データを参照する方法を更新する必要があります更新JSONで

を更新しました。いくつか前提を置いて、私があなたが与えた例を使ってデータを参照する方法を示すことができます。

最初は元の例です。あなたのためにデータを参照して出力するコードがいくつかあります。私は<cfdump>タグを含んでいます。 が必要なこのような状況でこれを使用したい場合は、のデータを参照してください。 deserializeJSON()関数はJSONを解析し、構造体のColdFusion配列を作成します。コードは、この出力を与えること

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

enter image description here

ここでは、新しいJSONフォーマットから同じ値を取得するために必要な更新されたコードの例です。 2つの配列があるため、データを参照するために別のcfloopを追加したことに注目してください。

コードは、この出力を与えること
<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> 

enter image description here

私はあなたがで遊ぶことができ、このコードのすべてと要旨を作成 - TryCF Gist 1