autoExpand asRows ohne Array

Hallo Zusammen,


ich bekomme aus einem Call folgendes JSON zurück.

{
 "data":{
  "purchaseOrders":{ 
   "shipment_1":{"id":"136333","handle":"A54E4B01-1BBA-4F43-9842-36F4D0ED58D6","status":"NEW","submittedAt":"2020-08-18 15:05:49.8371 +00:00","completedAt":null,"errors":[]
   },
   "shipment_2":{"id":"136334","handle":"CEC637D5-AA91-4C2B-9496-67C7C60D9596","status":"NEW","submittedAt":"2020-08-18 15:05:50.2834 +00:00","completedAt":null,"errors":[]
  }
 }
}
}

Ich möchte pro Shipment eine Zeile generieren. Das heißt ich müsste theoretisch durch alle sub-nodes von "purchaseOrders" iterieren. Ich weiß aber leider nicht wie ich auf child-nodes zugreifen kann.


Ich hatte das auch bereits mit {autoExpand : asRows} probiert, da bekomme ich aber pro Call nur eine Zeile zurück, heißt also er überschreibt die bestehende Zeile immer wieder. Ich glaube das liegt daran, dass die shipments nicht in einem Array liegen.


Wie könnte man das lösen?

Viele Grüße

Stefan

Versuch's mal hiermit. Mit ?matches wird nach allen Shipment_...-Nodes gesucht und anschließend über alle gefundenen Nodes iteriert.

<#assign row = target.addRow()> <#-- Header -->

<#assign all_shipments = json['data']['purchaseOrders']?matches('shipment_\\d*')>
<#list all_shipments as shipment>
<#assign row = target.addRow()>
${addColumns(row,  json['data']['purchaseOrders'][shipment!])}
</#list>

Vielleicht gibt's noch einen schöneren/einfacheren Weg. Das überlasse ich dem Synesty-Team, den zu finden.

Die Idee mit ?matches ist gut.


Hier mal noch ein anderer Ansatz aber ähnliche Idee:


<#---
Example JSON: 

{
  "data": {
    "purchaseOrders": {
      "shipment_1": {
        "id": "136333",
        "handle": "A54E4B01-1BBA-4F43-9842-36F4D0ED58D6",
        "status": "NEW",
        "submittedAt": "2020-08-18 15:05:49.8371 +00:00",
        "completedAt": null,
        "errors": []
      },
      "shipment_2": {
        "id": "136334",
        "handle": "CEC637D5-AA91-4C2B-9496-67C7C60D9596",
        "status": "NEW",
        "submittedAt": "2020-08-18 15:05:50.2834 +00:00",
        "completedAt": null,
        "errors": []
      }
    }
  }
}

-->

<#assign row = target.addRow()> <#-- Header -->

<#assign purchaseOrders = json['data']['purchaseOrders']>

<#list purchaseOrders as porder>
   <#-- assumption: to to get up to max. 10 shipments. shipments are ordered *_1 to *_x -->
  <#list 1..10 as i>
      <#assign row = target.addRow()>
       <#if porder['shipment_'+i]??>
        ${addColumns(row,  porder['shipment_'+i])}
       </#if>
    </#list>
</#list>


<#-- Result: -->

"id";"handle";"status";"submittedAt";"completedAt";"errors"
"136333";"A54E4B01-1BBA-4F43-9842-36F4D0ED58D6";"NEW";"2020-08-18 15:05:49.8371 +00:00";"";""
"136334";"CEC637D5-AA91-4C2B-9496-67C7C60D9596";"NEW";"2020-08-18 15:05:50.2834 +00:00";"";""



Dieser Ansatz geht davon aus, dass es pro PurchaseOrder max. eine Handvoll durchnummerierter Shipments gibt.


Wir nehmen das mal als Anlass um noch nach anderen Möglichkeit zu suchen. Aber aktuell fällt uns auch nichts besseres ein.