JSON ParsingTemplate

Hallo Zusammen,

könnte mir bitte eventuell jemand helfen, ein JSON ParsingTemplate zu erstellen. Ich blick nicht so 100% durch das Cookbook durch.

Als JSON bekomme ich folgendes Resultat und benötige in meinem Spreadsheet die Werte

  • produzent_4711
  • Produzent 4711
  • 123456
  • Stadt
  • Land

jeweils in einer Spalte

den Code hab ich schon mal reinbekommen

<#assign row = target.addRow()>

<#list json["_embedded"] as r >

<#list r["items"] as o>
    <#assign itemsRow = target.addRow()>
    ${itemsRow.addCol("code",o["code"]!)}
 </#list>

</#list>

Danke!

Viele Grüße
Ramin

Hallo Ramin,

mein Vorschlag wäre: über alle „items“ gehen und dabei jeweils den zugehörigen, ersten „value“ ausgeben:

<#assign row = target.addRow()>

<#list json["_embedded"]["items"] as r >
    <#assign itemsRow = target.addRow()>
    ${itemsRow.addCol("code",r["code"]!)}
    ${itemsRow.addCol("label",r["values"]["label"][0]["data"]!)}
	${itemsRow.addCol("address_zip_code",r["values"]["address_zip_code"][0]["data"]!)}
	${itemsRow.addCol("address_city",r["values"]["address_city"][0]["data"]!)}
	${itemsRow.addCol("address_country",r["values"]["address_country"][0]["data"]!)}
</#list>

(habe das template nicht getestet, hoffe es hat sich kein kleiner Fehler eingeschlichen.)

Viele Grüße
Torsten

Hallo Torsten,

senstationell! Genau das hab ich gebraucht.

Vielen Dank!

Viele Grüße
Ramin

Wir haben das Beispiel mal noch auf dieser Seite mit aufgenommen.

Hallo Torsten,

ich hätte da nochmal eine Rückfrage bzw. zwei zum Thema Multiselect Felder. Ich bekomme per API Felder zurück in denen theoretisch mehrere Werte stehen können

"grape_varieties": [
        {
            "locale": null,
            "scope": null,
            "data": [
                "chardonnay",
                "pinot_meunier",
                "pinot_noir"
            ]
        }
    ],

im obigen Beispiel würde ich die Werte gerne in einzelne Spalten eines Datastores schreiben. Theoretisch könnte ich hier max. 9 Werte zurückbekommen. Hier hatte ich versucht mit dem delimiter zu arbeiten, um die Werte zu trennen und in einzelne Spalten zu bekommen.

Dann gibt es noch diese Art von Multiselect Werten die per API kommen:

"recommended_food": [
        {
            "locale": "de_DE",
            "scope": null,
            "data": [
                "deer_braised",
                "venison"
            ],
            "linked_data": {
                "deer_braised": {
                    "attribute": "recommended_food",
                    "code": "deer_braised",
                    "labels": {
                        "de_DE": "Reh geschmort"
                    }
                },
                "venison": {
                    "attribute": "recommended_food",
                    "code": "venison",
                    "labels": {
                        "de_DE": "Wild"
                    }
                }
            }
        }
    ],

Hier könnten theoretisch n Werte zurückkommen. Relevant sind die Werte die bei de_DE mitkommen. Da würde es ausreichen die Werte kommasepariert in eine Spalte zuschreiben.

Viele Grüße
Ramin

Hallo Ramin,

zu 1.)
Wenn du jeden Wert in einer Spalte ausgeben willst, dann sollte das parsingTemplate in etwas wie folgt aussehen:

<#assign row = target.addRow()>
<#list json['grape_varieties'] as j >
  <#assign row = target.addRow()>
  <#list j['data'] as d>
    ${row.addCol(("Wert_"+d_index), d!)}
  </#list>
</#list>

Der Teil ${row.addCol(("Wert_"+d_index), d!)} sorgt dafür, dass pro Wert eine neue Spalte mit dem index erstellt wird. Das Ergebnis Spreadsheet sieht dann folgendermaßen aus:

zu 2.) Wenn du nur Werte bei locale = „de_DE“ ausgeben willst, kannst du noch eine if Bedingung einbauen. Um alle data Werte Komma-separiert in einer Spalte auszugeben kannst du auch die addColumns Funktion verwenden:

<#assign row = target.addRow()>
<#list json['recommended_food'] as j >
  <#assign row = target.addRow()>
  <#if j['locale']! == "de_DE">
     ${addColumns(row,j["data"],"Werte")}
   </#if>
 </#list>

Ergebnis:

VG Torsten

Hallo Torsten,

danke für die Hilfestellung. Die Frage wäre jetzt noch, wie das in das Gesamtkonstrukt reinpasst. Ich starte vorher ja schon mit der Erstellung einer Liste und das müsste dann noch zusätzlich dazukommen.

<#assign row = target.addRow()>
<#assign numRows = 0 />
<#list json[„_embedded“][„items“] as r >
<#assign itemsRow = target.addRow()>
${itemsRow.addCol(„sku“,r[„identifier“]!)}
${itemsRow.addCol(„name“,r[„values“][„name“][0][„data“]!)}
${itemsRow.addCol(„description“,r[„values“][„description“][0][„data“]!)}
${itemsRow.addCol(„year“,r[„values“][„year“][0][„data“]!)}
${itemsRow.addCol(„grape_varieties“,r[„values“][„grape_varieties“][0][„data“]!)}
${itemsRow.addCol(„recommended_food“,r[„values“][„recommended_food“][0][„linked_data“][„labels“][„de_DE“]!)}
<#assign numRows = numRows + 1 />
</#list>
<#if (numRows > 0 && callcounter < callLimit)>
<#assign nextPageNumber = (callcounter + 1)>
${nextUrl(json[„_links“][„next“][„href“]!)}
</#if>

Viele Grüße
Ramin

Hallo Ramin,

du müsstest vermutlich die beiden Zeilen

${itemsRow.addCol(„grape_varieties“,r[„values“][„grape_varieties“][0][„data“]!)}
${itemsRow.addCol(„recommended_food“,r[„values“][„recommended_food“][0][„linked_data“][„labels“][„de_DE“]!)}

in deinem parsingTemplate durch die ersetzen. Das vollständige template sollte dann in etwa so aussehen:

<#assign row = target.addRow()>
<#assign numRows = 0 />
<#list json["_embedded"]["items"] as r >
<#assign itemsRow = target.addRow()>
${itemsRow.addCol("sku",r["identifier"]!)}
${itemsRow.addCol("name",r["values"]["name"][0]["data"]!)}
${itemsRow.addCol("description",r["values"]["description"][0]["data"]!)}
${itemsRow.addCol("year",r["values"]["year"][0]["data"]!)}

<#list r['grape_varieties'] as gv>
 <#list gv['data'] as d>
  ${itemsRow.addCol(("Wert_"+d_index), d!)}
 </#list>
</#list>

<#list r["values"]["recommended_food"] as rf>
 <#if rf['locale']! == "de_DE">
    ${addColumns(itemsRow, rf["data"],"recommended_food")}
 </#if>
</#list>

<#assign numRows = numRows + 1 />
</#list>
<#if (numRows > 0 && callcounter < callLimit)>
<#assign nextPageNumber = (callcounter + 1)>
${nextUrl(json["_links"]["next"]["href"]!)}
</#if>

(nicht getestet, hoffe es ist kein Fehler drin)

Viele Grüße
Torsten

Hallo Torsten,

ah ok, ich wusste nicht, dass man innerhalb einer „list“ eine weitere erstellen kann. Für den Punkt grape_varieties passt es jetzt perfekt.

Bei recommended_food würde ich mit dem Template nur den Inhalt aus dem data bekommen, der allerdings nicht die Übersetzungen beinhaltet

"recommended_food": [
        {
            "locale": "de_DE",
            "scope": null,
            "data": [
                "deer_braised",
                "venison"
            ],
            "linked_data": {
                "deer_braised": {
                    "attribute": "recommended_food",
                    "code": "deer_braised",
                    "labels": {
                        "de_DE": "Reh geschmort"
                    }
                },
                "venison": {
                    "attribute": "recommended_food",
                    "code": "venison",
                    "labels": {
                        "de_DE": "Wild"
                    }
                }
            }
        }
    ]

Ich bräuchte die de_DE Werte die innerhalb des Datensatzes linked_data stecken. Hier ist allerdings das Problem, dass im linked_data immer unterschiedliche Werte stehen können.

${addColumns(itemsRow, rf["data"],"recommended_food")}

hier müsste ich also statt [„data“] den Satz [„linked_data“] und was drunter kommen könnte reinbekommen, um da dann die de_DE Werte abzugreifen.

Die if-Schleife hab ich mal rausgenommen, weil die meiner Meinung nach nicht benötigt wird.

Viele Grüße
Ramin

Hallo @ramin-ww,

du kannst die list Anweisung beliebig verschachteln. Ich habe den recommended_food Teil nochmal etwas angepasst, sodass jetzt über alle linked_data Schlüssel gelaufen wird und alle de_DE Werte zusammengesetzt werden.

<#assign row = target.addRow()>
<#assign numRows = 0 />
<#list json["_embedded"]["items"] as r >
<#assign itemsRow = target.addRow()>
${itemsRow.addCol("sku",r["identifier"]!)}
${itemsRow.addCol("name",r["values"]["name"][0]["data"]!)}
${itemsRow.addCol("description",r["values"]["description"][0]["data"]!)}
${itemsRow.addCol("year",r["values"]["year"][0]["data"]!)}

<#list r['grape_varieties'] as gv>
 <#list gv['data'] as d>
  ${itemsRow.addCol(("Wert_"+d_index), d!)}
 </#list>
</#list>

<#assign recommended_food = "">
<#list r["values"]["recommended_food"] as rf>
  <#list rf['linked_data'] as key,value>
    <#if value['labels']['de_DE']! != "">
      <#assign recommended_food += (value['labels']['de_DE'] + ",")  />
    </#if>
  </#list>
</#list>
${itemsRow.addCol("recommended_food", recommended_food!)}


<#assign numRows = numRows + 1 />
</#list>
<#if (numRows > 0 && callcounter < callLimit)>
<#assign nextPageNumber = (callcounter + 1)>
${nextUrl(json["_links"]["next"]["href"]!)}
</#if>

Viele Grüße
Torsten

Hallo Torsten,

ich hätte zu dem Thema „Multiselect“ (JSON ParsingTemplate - #9 von ramin-ww) nochmal eine kurze Rückfrage.

Du hattest mir ja ein perfektes Script geliefert:

<#assign recommended_food = "">
<#list r["values"]["recommended_food"] as rf>
  <#list rf['linked_data'] as key,value>
    <#if value['labels']['de_DE']! != "">
      <#assign recommended_food += (value['labels']['de_DE'] + ",")  />
    </#if>
  </#list>
</#list>
${itemsRow.addCol("recommended_food", recommended_food!)}

Es werden also alle Daten, die über den linked_data Schlüssel gehen mit den de_DE Werten zusammengesetzt und einzelne Daten werden durch + "," kommaspariert.
Allerdings wird folgt auch immer nach dem letzten Wert ein Komma
Reh geschmort, Hirsch geschmort,

Gibt es eine Möglichkeit, dass das Komma immer nur gesetzt wird, wenn ein nachfolgender Wert kommt?

Viele Grüße
Ramin

Hallo @ramin-ww,

du kannst an die erstellte variable recommended_food noch ein ?remove_ending(',') setzen. Also dass es dann so aussieht:

${itemsRow.addCol("recommended_food", recommended_food!?remove_ending(','))}

Viele Grüße
Lukas

Hallo @synesty-Lukas

Top! Danke!

Viele Grüße
Ramin