2016-05-17 8 views
1

I haben JSON Daten wie die folgendenmit JSON Daten in Coldfusion

{ 
"category" : [ 
    { 
     "name" : "digital stickers", 
     "products" : [ 
      { 
       "name" : "round digital stickers", 
       "urlPublic" : "index.cfm/digital-stickers/round-stickers", 
       "urlPortal" : "tab=round digital stickers" 
      }, 
      { 
       "name" : "square digital stickers", 
       "urlPublic" : "index.cfm/digital-stickers/square-stickers", 
       "urlPortal" : "tab=square digital stickers" 
      } 
     ] 
    }, 
    { 
     "name" : "Litho stickers", 
     "products" : [ 
      { 
       "name" : "round litho stickers", 
       "urlPublic" : "index.cfm/litho-stickers/round-stickers", 
       "urlPortal" : "tab=round litho stickers" 
      }, 
      { 
       "name" : "square litho stickers", 
       "urlPublic" : "index.cfm/litho-stickers/square-stickers", 
       "urlPortal" : "tab=square litho stickers" 
      } 
     ] 
    } 
] 
} 

I DeserializeJSON(theData) wie unten

<cfset cfData=DeserializeJSON(theData)> 

habe ich dann einen Datenarray verwendet habe die Kategorie zum Speichern von Werten

<cfset dataArray = cfData.category> 

und ausgespuckt haben sie in einer Schleife aus

<cfloop array="#dataArray#" index="elem"> 
    <!--- print out value for demo purposes ---> 
    <cfoutput> 
      <h3>#elem.name#</h3> 

    </cfoutput> 
</cfloop> 

Das funktioniert alles gut und ich sehe die 2 Kategorienüberschriften - "digitale Aufkleber" und "Litho Aufkleber".

Ich möchte jetzt die Produkte in einer Liste unter jeder relevanten Kategorie anzeigen. Also unter "digitale Aufkleber" zu haben "Runde digitale Aufkleber" und "quadratische digitale Aufkleber", dann unter Litho Aufkleber haben "Runde Litho Aufkleber" und "Quadrat Litho Aufkleber" etc.

Ich habe versucht, ein neues Array zu erstellen wie unten

<cfset productArray = cfData.products> 

aber ich die Fehlermeldung bekam ‚ist Element Produkte undefined in cfdata‘

Dann war mein Plan diese Schleife in der Stromschleife zu setzen durch die entsprechenden Produkte zu Schleife. Ich denke, ich brauche möglicherweise ein separates Array für jede Kategorie, um die Produkte in dieser bestimmten Kategorie durchzulaufen.

Jede Hilfe würde sehr geschätzt werden - danke im Voraus!

Antwort

2

Sie erhalten einen Fehler, weil sich die Produkte nicht unter cfData befinden. Das Produkt-Array befindet sich unter cfdata.category[i].products. Um das gewünschte Ergebnis zu erzielen, können Sie so etwas wie unten tun:

<cfoutput> 
    <h3>#elem.name#</h3> 
    <cfloop array="#elem.products#" index="innerelem"> 
     #innerelem.name#<br> 
    </cfloop> 
</cfoutput> 

aktualisieren:

Sobald Sie die JSON deserialisieren, es ist nur eine normale Struktur. Ihr cfdata.category (dataArray) ist ein array of structures mit Namen und Produktschlüsseln. Die products is another array of structures.

Wenn Sie dataArray durchlaufen, erhalten Sie in der Variable elem eine Struktur mit Namen und Produktschlüsseln. Dann müssen Sie Produkte durchlaufen, um Namen in Produkten zu erhalten, was ich im obigen Code mache.

Um den Code zu verstehen, verwenden Sie in jeder Phase cfdump.

  1. Innerhalb der ersten Schleife, cfdump elem. Sie erhalten eine Struktur von Name und Produkte.
  2. Sie Zugriff auf Name von elem.name.
  3. Ähnlich können Sie Produkte von elem.products zugreifen.
  4. Wenn Sie cfdump elem.Produkte, Sie werden feststellen, dass es eine Reihe von Struktur ist.
  5. Da Sie elem.products -Array zugreifen können, können Sie es wie Sie haben looped Array cfdata.category. Sie müssen dies innerhalb der ersten Schleife tun, da Sie Zugriff auf elem.products innerhalb der ersten Schleife haben.
  6. Jetzt in der zweiten Schleife, erhalten Sie Ihre jede Struktur innerhalb elem.products in der Variablen internerelem.
  7. cfdump Innerelem in der zweiten Schleife. Sie sehen eine Struktur mit den Schlüsseln name, urlpublic und urlportal mit ihren jeweiligen Werten.
  8. Da Sie Zugriff auf diese Struktur haben, können Sie Ihre Namen von internerelem.name erhalten.
  9. Sie haben gut mit URL.
  10. Verwenden Sie cfdump viel, um Code zu verstehen und den Code zu debuggen. Auch während der Entwicklung eines Codes. Es wird dir sehr helfen.
+1

Absolut perfekt. Obwohl ich ehrlich sein muss. Ich verstehe es nicht vollständig. Findet '# elem.products #' auf die nächste Ebene in der JSON-Struktur? Dann jedes Mal ein neues Array erstellen? Dann, wenn Sie "# innerelem.name #" tun, würde das durch alle Produktnamen durchlaufen werden. Um meine Links spucken raus richtig ich das ‚

  • #innerelem.name#

  • ‘ Wie gesagt angepasst haben - funktioniert ein Genuss. Vielen Dank. – Sprose

    +0

    @ user3008971, Bitte überprüfen Sie das Update. –