Json parsing Probleme

Guten Abend zusammen,

ich würde gerne Metafield Übersetzungen aus der Shopify Graphql 2024-10 holen.
Mein query sieht wie folgt aus:
query MyQuery {
translatableResource(resourceId: „gid://shopify/Product/112233“) {
nestedTranslatableResources(first: 3) {
nodes {
translations(locale: „de“) {
value
}
resourceId
}
}
}
}

Und mein json das zurück kommt so:
{
„data“: {
„translatableResource“: {
„nestedTranslatableResources“: {
„nodes“: [
{
„translations“: ,
„resourceId“: „gid://shopify/ProductOption/10653499719844“
},
{
„translations“: [
{
„value“: "Übertragung: Allrad "
}
],
„resourceId“: „gid://shopify/Metafield/37317293310116“
},
{
„translations“: [
{
„value“: „["Italien"]“
}
],
„resourceId“: „gid://shopify/Metafield/37317293342884“
}
]
}
}
},
„extensions“: {
„cost“: {
„requestedQueryCost“: 7,
„actualQueryCost“: 7,
„throttleStatus“: {
„maximumAvailable“: 2000,
„currentlyAvailable“: 1945,
„restoreRate“: 100
}
}
}
}
später im Mapper soll das ganze so aussehen:

translatableResourceresourceId resourceId value1 resourceId1 value2 resourceId2
gid://shopify/Product/112233 gid://shopify/ProductOption/10653499719844 Übertragung: Allrad gid://shopify/Metafield/37317293310116 [\Italien] gid://shopify/Metafield/37317293342884
Vielen Dank schon mal !
VG
Sean

Hi Sean,

probiers mal hiermit.

<#assign count = 0>
<#assign row = target.addRow()>
<#assign row = target.addRow()>
<#list json["data"]["translatableResource"]["nestedTranslatableResources"]["nodes"] as j >
<#assign count += 1>
  ${row.addCol( "value"+count, j["translations"][0]["value"] )}
  ${row.addCol("resourceID"+count, j["resourceId"])}
</#list>

Das gibt mir folgendes Ergebnis zurück:

Viele Grüße
Stefan

1 Like

Danke für deine schnelle Antwort Stefan !

Ich habe diese Fehlermeldung raus bekommen: Fehler beim Ausführen eines Freemarker Skripts. (Root Causes: RuntimeException: _TemplateModelException: No compatible overloaded variation was found; declared parameter types and argument value types mismatch. The FTL type of the argument values were: string (wrapper: f.t.SimpleScalar), Null. The Java type of the argument values were: String, Null. The matching overload was searched among these members: com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String, String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition, String, String, com.synesty.csvconverter.api.converter.ColFactory), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition, String, String) ---- FTL stack trace („~“ means nesting-related): - Failed at: ${row.addCol(„value“ + count, j[„tran… [in template „jsonToSpreadsheet“ at line 6, column 3] ---- _TemplateModelException: No compatible overloaded variation was found; declared parameter types and argument value types mismatch. The FTL type of the argument values were: string (wrapper: f.t.SimpleScalar), Null. The Java type of the argument values were: String, Null. The matching overload was searched among these members: com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String, String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition, String, String, com.synesty.csvconverter.api.converter.ColFactory), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition, String, String) ---- FTL stack trace (“~" means nesting-related): - Failed at: ${row.addCol(„value“ + count, j["tran… [in template „jsonToSpreadsheet“ at line 6, column 3] ----)

Also habe ich eine null abfrage in das parsing eingebaut
<#assign count = 0>
<#assign row = target.addRow()>
<#list json[„data“][„translatableResource“][„nestedTranslatableResources“][„nodes“] as j>
<#assign count += 1>

<#-- Check if "translations" and "value" exist to prevent null errors -->
<#if j["translations"]?has_content && j["translations"][0]["value"]?has_content>
    ${row.addCol("value" + count, j["translations"][0]["value"])}
<#else>
    ${row.addCol("value" + count, "")} <!-- or any default value -->
</#if>

<#-- Check if "resourceId" exists to prevent null errors -->
<#if j["resourceId"]?has_content>
    ${row.addCol("resourceID" + count, j["resourceId"])}
<#else>
    ${row.addCol("resourceID" + count, "")} <!-- or any default value -->
</#if>

</#list>

Mein Ergebnis jetzt sieht dadurch so aus:

Die autom. ohne pagination bekommt das eigentlich schon super gut hin.


Mir fehlt „nur“ noch die „translatableResource(resourceId: „gid://shopify/Product/112233“)“
Die wird dann auch später im Query als Variable übergeben

Hallo Sean,

ich denke das ist nur ein kleines Problem. Du musst vermutlich noch ein <#assign row = target.addRow()> hinzufügen. Beim 1. Aufruf wird nur die Header Zeile erzeugt:

<#assign count = 0>
<#assign header = target.addRow()>
<#assign row = target.addRow()>
<#list json["data"]["translatableResource"]["nestedTranslatableResources"]["nodes"] as j>
<#assign count += 1>
...

VG Torsten

1 Like

Hi @synesty-Torsten,

das hat super funktioniert, danke!!

Ich hoffe jetzt nur noch eine Kleinigkeit, bekomme ich die translatableResource(resourceId: „gid://shopify/Product/112233“)
Noch irgendwie da rein?
Die resourceId auf der translatableResource-Ebene ist ungleich der resourceID auf der Translation-Ebene.
Auf der translatableResource-Ebene ist das die Produkt-ID und auf der Translation-Ebene die Metafield-ID.
Ich brauche aber beides in einer Zeile.
VG
Sean

Du kannst die resourceId zusätzlich noch in der query mit angeben, falls du das noch nicht hast:

Dann sollte die resourceId auch in der response vorhanden sein und du kannst sie im parsingTemplate als extra Spalte ausgeben.

<#assign count = 0>
<#assign header = target.addRow()>
<#assign row = target.addRow()>
${row.addCol("resourceId", json["data"]["translatableResource"]["resourceId"]! )}

<#list json["data"]["translatableResource"]["nestedTranslatableResources"]["nodes"] as j>
<#assign count += 1>
...
2 Likes

Torsten herrlich, hat super funktioniert!
Sende mir gerne per PN deine Adresse und ein Blumenstrauß ist auf dem weg ! :smiley:

1 Like