JSON2SpreadSheet: keine Verarbeitung mehr nach leerem JSON Objekt

In einem JSON2Spreadsheet Step habe ich einen "Abbruch" der Verarbeitung OHNE FEHLERMELDUNG wenn das JSON Objekt aus dem Spreadsheet URL Download leer ist. In diesem Fall werden nur die ersten X Zeilen an den nächsten Step übergeben.


Der URL Download gibt in manchen Fällen ein leeres Objekt zurück:

{
    "metafields": []
}

Sobald ein solches JSON verarbeitet wird, stoppt die Verarbeitung und ich kriege nur noch die zuvor verarbeiten JSONs in das Output Spreadsheet. Ich habe schon versucht im Transformation Template mit ?has_content oder ?size die Verarbeitung zu steuern, aber der Step gibt weiterhin keine Daten weiter. Hier der Code aus meinem Transformation Template. Es ist sicherlich einiges doppelt gemoppelt, aber in meiner Verzweiflung...

<#if json["metafields"]?has_content >
<#list json["metafields"] as prodmetafields>
	<#if prodmetafields?has_content>
    	<#list prodmetafields as field>
		<#if field?has_content>
			<#assign row = target.addRow()>
			<#if field["owner_id"] != "">
				<#assign row = target.addRow()>
				${addColumns(row,field["owner_id"],"product_id")}
				<#assign value = field["value"]?string>
				${addColumns(row,value?replace('"',''),"sz_innenauftrag")}
			<#else>
				<#assign row = target.addRow()>
				${addColumns(row,"empty","product_id")}
				${addColumns(row,"empty","sz_innenauftrag")}
			</#if>
		</#if>
    	</#list>
	</#if>
</#list>
</#if>

Unter der Annahme dass das JSON in metafields ungefähr so aussieht, sollte es wie folgt gehen:


{
  "metafields": [
    {
      "owner_id": "1",
      "value": "myvalue"
    },
    {
      "owner_id": "2",
      "value": "myvalue2"
    }
  ]
}



parsingTemplate:


<#if (json["metafields"]?has_content) >

  <#list json["metafields"] as field>

  <#if field?has_content>
              <#assign row = target.addRow()>
              <#if field["owner_id"] != "">
                  <#assign row = target.addRow()>
                  ${addColumns(row,field["owner_id"],"product_id")}
                  <#assign value = field["value"]?string>
                  ${addColumns(row,value?replace('"',''),"sz_innenauftrag")}
              <#else>
                  <#assign row = target.addRow()>
                  ${addColumns(row,"empty","product_id")}
                  ${addColumns(row,"empty","sz_innenauftrag")}
              </#if>
          </#if>    


  </#list>
</#if>


Beispiel-Ergebnis:



Der Unterschied ist:


  • die innere List-Schleife (<#list prodmetafields as field>) ist nicht nötig, da die erste Schleife bereits über die einzelnen Elemente des metafield-Arrays iteriert. Deshalb haben wir aus ihrer ersten Schleife <#list json["metafields"] as field> gemacht.




EDIT: Bitte auch noch mal das gewünschte Ergebnis spezifizieren, denn das steht gefühlt nur etwas "zwischen den Zeilen". Danke.

Wir wollen für alle Produkte in einem Datastore bestimmte Metafields auslesen, hierfür nutzen wir die Shopify Metafields API und filtern hier im SpreadSheetURLDownlaod bereits nach keys. In einigen Fällen ist der Key aber nicht gesetzt, und in diesem Fall ist der JSON Response ein leeres Metafield Objekt.


Das Problem ist: sobald ein solches Objekt im JSON2Spreadsheet Step vorkommt, findet keine weitere Verarbeitung des Inputs statt, es werden nur die ersten X Einträge in den Output geschrieben, alle Einträge aus dem Input ab Position X+1 werden nicht mehr in den Output geschrieben, obwohl ich ja eigentlich eine Prüfung auf leeren Inhalte habe.


Ich versuche jetzt mal den Weg alle Metafields auszulesen und dann in Synesty zu filtern, aber ich würde gerne in Zukunft den Filter in Shopify nutzen um den Traffic und die Daten möglichst gering zu halten.

Hallo Synesty Team,


leider hat der Code auch nicht so richtig funktioniert, ich hatte trotzdem nach dem leeren Metafield Objekt Abbrüche des Steps. Ich habe den Flow nun so angepasst, dass die URL im URL Download alle Metafields eines Produktes ermittelt. Ein Filtern im anschließenden Step nach Key hat nicht funktioniert, auch hier gab es Abbrüche. Daher habe ich alle Metafields in ein Spreadsheet geschrieben und dieses anschließend je nach Bedarf gefiltert. Folgendes JSON2Spreadsheet Transformation Template hat funktioniert:

<#if (json["metafields"]?has_content) >
  <#list json["metafields"] as field>
  <#if field?has_content>
              <#assign row = target.addRow()>
              <#if field["owner_id"] != "">
                  <#assign row = target.addRow()>
                  ${addColumns(row,field["owner_id"],"product_id")}
                  	<#assign value = field["value"]?string>
					<#assign key = field["key"]?string>
					${addColumns(row,key?replace('"',''),"key")}
					${addColumns(row,value,"value")}
              </#if>
          </#if>
  </#list>
</#if>

Ist es möglich mal eine JSON-Beispiel hier zu posten (gern sensitive Daten entfernen), welches zu so einem Abbruch führt? Daran lässt sich besser analysieren.

Ist metafields vorhanden aber ein leeres Array? oder fehlt das metafields komplett?

Was genau ist mit key gemeint?


Sie beziehen sich auf https://help.shopify.com/en/api/reference/metafield#index-2019-07 oder? Wie sieht der Request aus?


Evtl. hilft ein

<#if (json["metafields"]?? && json["metafields"]?has_content) >


Der erste check prüft ob es metafields vorkommt.






Hallo,


Genau, ich beziehe mich auf die von Ihnen verlinkte Shopify Metafield API

Beispiel: Eine Query auf alle Metafields

# URL
https://my-demo-store.myshopify.com/admin/api/2019-07/products/3822959820874/metafields.json

# JSON Response
{
    "metafields": [
        {
            "id": 8711253557322,
            "namespace": "global",
            "key": "description_tag",
            "value": "2012, Carignan “L’Insoumise”, Domaine Aubai Mema, DomaineAubai Mema, Languedoc, FrankreichAlkohol: 13,0%Restzucker:1,8 g/LiterSäure: 3,7 g/LiterRebsorte: 90%Carignan, 10% Cabernet SauvignonAusbau: StahltankErtrag: 30 hl/haVerschlussart:NaturkorkenGenießenbis: 2019Wein/Abfüllung:&nbsp;Domaine Aubai Mema, 120 Chemin de Junas, 30250 Aubais, FrankreichDieser Weinenthält Sulfite.",
            "value_type": "string",
            "description": "Description of the product for search engines",
            "owner_id": 3822959820874,
            "created_at": "2019-09-04T00:06:59+02:00",
            "updated_at": "2019-09-04T00:06:59+02:00",
            "owner_resource": "product",
            "admin_graphql_api_id": "gid://shopify/Metafield/8711253557322"
        }
    ]
}


Beispiel Query Metafields mit key "sz_innenauftrag"


# URL
https://my-demo-store.myshopify.com/admin/api/2019-07/products/3822959820874/metafields.json?key=sz_innenauftrag

#JSON Response
{
    "metafields": []
}

Wenn eine Query kein Resultat liefert, dann wird ein leeres JSON Objekt geliefert.

Hier mal mein aktueller Freemarker Template Code:

<#if (json["metafields"]?has_content) >
  <#list json["metafields"] as field>
  <#if field?has_content>
              <#assign row = target.addRow()>
              <#if field["owner_id"] != "">
                  <#assign row = target.addRow()>
                  ${addColumns(row,field["owner_id"],"product_id")}
                  	<#assign value = field["value"]?string>
					<#assign key = field["key"]?string>
					${addColumns(row,key?replace('"',''),"key")}
					${addColumns(row,value,"value")}
              </#if>
          </#if>
  </#list>
</#if>

Dieser funktioniert, solange ich keinen Filter in der API URL anwende (siehe erstes Beispiel). Sobald ich in der API URL den Filter aus dem zweiten Beispiel hinzufüge, beendet der JSON2Spreadsheet, sobald ein leeres Metafield JSON geliefert wurde.

Hier noch mal die Screenshots zweier Runs, der rechte ist ohne Filter, der Linke ist mit Filter.

image


image


Man sieht im Step "SZ Innenauträge Änderungen als CSV speichern", dass nur noch 20 Zeilen angelegt wurden statt 28 wie im ersten Step. Wenn ich z.B. das Limit von 30 auf 100 erhöhe bleibt das Ergebnis gleich, nach 20 Zeilen ist Schluss.




image


image



Bitte mal folgendes probieren, morgen mehr dazu.


<#-- always add an empty header row -->
<#assign row = target.addRow()>

<#if (json["metafields"]?has_content) >
  <#-- non-empty metafields -->
  <#list json["metafields"] as field>
  <#if field?has_content>
  <#assign row = target.addRow()>
              <#if field["owner_id"] != "">
                  
                  ${addColumns(row,field["owner_id"],"product_id")}
                    <#assign value = field["value"]?string>
          <#assign key = field["key"]?string>
          ${addColumns(row,key?replace('"',''),"key")}
          ${addColumns(row,value,"value")}
              </#if>
          </#if>
  </#list>

<#else>
  <#-- empty metafields :  just add an empty dummy-data row, which is needed for skipping and continue parsing the next file -->
  <#assign row = target.addRow()>
</#if>


Funktioniert!