JSON dynamisch einlesen

Hallo,

gibt es eine Möglichkeit JSON (mit immer gleicher Grundstruktur) dynamisch, sprich ohne fixe Angabe von Elementnamen, einzulesen?

Ziel ist es zwecks Doku ein XLS zu erzeugen, welches die Key-Sources-fieldId-Beziehung visualisiert. Bei Multivalue (Array) auch gerne jeden möglichen Value in eigener Spalte :slight_smile: Beispiel:

{
„fieldId“: „property-12-161“,
„id“: 161,
„isCombined“: false,
„key“: null,
„lang“: „de“,
„type“: „property-value“,
„value“: null
},
{
„fieldId“: „property-11-32“,
„id“: 32,
„isCombined“: false,
„key“: null,
„lang“: „de“,
„type“: „property-value“,
„value“: null
}

Wenn ein Key keine Sources hat kann er ebenfalls in die Liste, nur eben dann ohne Wert in der zweiten Spalte

Tabelle sollte dann in etwa so aussehen:

ean | barcode-1
productDescription.productLine | itemText-name1
mediaAssets.0.IMAGE | image-image-image

Beispiel JSON - relevant sind insbesondere was unter „mappings“ definiert ist.
Sample.json (95,6 KB)

Warum überhaupt? Weil die Gruppierung unter „Mappings“ immer unterschiedlich sein kann, sprich mal gibt es „brand“, „bulletPoint“ etc., ein anderes mal ist es nach „default“, „product“ etc. gruppiert.

Danke und Gruß
Tim

Hallo Tim,

schau mal ob dir folgendes parsingTemplate hilft:

<#assign row = target.addRow()>
<#list json["data"]["mappings"] as key,value >
  <#list value["fields"] as field>
     <#assign row = target.addRow()>
     ${row.addCol("key", field["key"]!)}

    <#-- eine Spalte mit zusammengefassten sources -->
     ${row.addCol("sources", field["sources"]?map(s -> s["fieldId"]!)?join(";"))}

    <#-- eine Spalte pro source -->
    <#list field["sources"] as source>
        ${row.addCol("sources_" + source_index, source["fieldId"]!)}
    </#list>
     
  </#list>
</#list>

Da sind zwei Varianten enthalten. In der „sources“ Spalte werden alle fieldId Semikolon separiert ausgegeben und in der zweiten Variante wird pro source eine extra Spalte erzeugt.

Viele Grüße
Torsten

2 „Gefällt mir“

@synesty-Torsten Wunderbar, danke! :exploding_head:

1 „Gefällt mir“